MATLAB Answers

Pietro
0

indexing multiple values in two arrays with different size

Asked by Pietro
on 13 Feb 2019 at 16:21
Latest activity Commented on by madhan ravi
on 15 Feb 2019 at 10:49
I have a simple problem that unfortunately I am failiing so solve (and to find solutions in internet).
Assuming I have 2 matrixes
a = [1 1 1 1 2 2 2 2 2 5 5 5; 0 0 0 0 0 0 0 0 0 0 0 0]';
b = [1 2 5; 11 12 15]';
I would like (without a for loop, that is my current, very slow implementation) to assign in a the corresponding values in the second column of b, when a(x, 1) == b(x,1). Basically the final result should be
a = [1 1 1 1 2 2 2 2 2 5 5 5; 11 11 11 11 12 12 12 12 12 15 15 15]
Thanks a lot for any help

  0 Comments

Sign in to comment.

2 Answers

Answer by madhan ravi
on 13 Feb 2019 at 16:53
 Accepted Answer

A=sum(a(:,1)==b(:,1).');
a(:,2)=repelem(b(:,2),A).'

  1 Comment

For version prior to 2016b:
A=sum(bsxfun(@eq,a(:,1),b(:,1).'));
a(:,2)=repelem(b(:,2),A).'

Sign in to comment.


Answer by Pietro
on 14 Feb 2019 at 9:52

I received also another way to do it
a(:,2) = interp1(b(:,1), b(:,2), a(:,1));
I do not know which one is the more efficient, but both solutions work
I will use this one as it is only 1 line of code instead of two
Thanks for the support

  4 Comments

Show 1 older comment
Thanks a lot, I wanted to do the same but just did not have the time
Thanks again for the support
Unfortunately your method does not work because this operation
A=sum(a(:,1)==b(:,1).');
requires too much memory (in my case b(:,1) is bigger than 1M values), so even if more efficient in speed, it is not very efficient in memory management (the tipical trade off)
Thanks anyway
So instead of creating variable A in workspace why not directly implement it ?
a(:,2)=repelem(b(:,2),sum(a(:,1)==b(:,1).')).';

Sign in to comment.