indexing multiple values in two arrays with different size

3 Ansichten (letzte 30 Tage)
Pietro
Pietro am 13 Feb. 2019
Kommentiert: madhan ravi am 15 Feb. 2019
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

Akzeptierte Antwort

madhan ravi
madhan ravi am 13 Feb. 2019
A=sum(a(:,1)==b(:,1).');
a(:,2)=repelem(b(:,2),A).'
  1 Kommentar
madhan ravi
madhan ravi am 13 Feb. 2019
For version prior to 2016b:
A=sum(bsxfun(@eq,a(:,1),b(:,1).'));
a(:,2)=repelem(b(:,2),A).'

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Pietro
Pietro am 14 Feb. 2019
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 Kommentare
Pietro
Pietro am 15 Feb. 2019
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
madhan ravi
madhan ravi am 15 Feb. 2019
So instead of creating variable A in workspace why not directly implement it ?
a(:,2)=repelem(b(:,2),sum(a(:,1)==b(:,1).')).';

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by