MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply TodayTo resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Asked by Iro on 6 May 2013

Hi, I have the following matrices:

X = [1001 1011 1001 10 130 0.8 0.2; 1001 1012 1001 11 150 0.2 0.8; 1001 1012 1001 11 131 0.5 0.5; 1001 1012 1002 11 140 0.6 0.4];

Y = [1001 1011 1001 10 112 1 122 214; 1001 1011 1001 11 221 1 134 113; % extra row 1001 1012 1001 11 98 1 58 82; 1001 1012 1001 11 68 1 59 67; 1001 1012 1002 11 32 1 56 98; 1004 1012 1005 12 67 1 89 132]; % extra row

and I want to get this :

M = [1001 1011 1001 10 130 0.8 0.2; 1001 1011 1001 11 NaN NaN NaN; % or sth equivalent to NaN 1001 1012 1001 11 150 0.2 0.8; 1001 1012 1001 11 131 0.5 0.5; 1001 1012 1002 11 140 0.6 0.4; 1004 1012 1005 12 NaN NaN NaN];

I have difficulty in finding/comparing 4 elements together of every row (M(:,1:4)), and also when the size of the matrices in not equal...

Any suggestions on which could be the right function to solve it??

Thanks,

Iro

*No products are associated with this question.*

Answer by Andrei Bobrov on 7 May 2013

Accepted answer

ii = ismember(Y(:,1:4),X(:,1:4),'rows'); M = [Y(:,1:4),nan(size(Y,1),3)]; M(ii,5:end) = X(:,5:end);

Show 3 older comments

Iro on 9 May 2013

and what about when I have multiple rows with the same (r,1:4) combinations in Y? For example:

X = [1001 1011 1001 10 130 0.8 0.2; 1001 1012 1001 11 150 0.2 0.8; 1001 1012 1002 11 131 0.5 0.5; 1001 1013 1002 11 140 0.6 0.4];

Y = [1001 1011 1001 10 112 1 122 214; 1001 1011 1001 11 221 1 134 113; % extra (r,1:4) combination 1001 1011 1001 11 221 1 115 112; % extra multiple comb 1001 1012 1001 11 98 1 58 82; % multiple existing comb 1001 1012 1001 11 98 1 35 72; % multiple existing comb 1001 1012 1001 11 98 1 68 62; % multiple existing comb 1001 1012 1002 11 68 1 59 67; 1001 1013 1002 11 32 1 56 98; 1004 1012 1005 12 67 1 89 132]; % extra comb

I tried with

[tf,loc] = ismember(Y(:,1:4),X(:,1:4),'rows') M = [Y(:,1:4),nan(size(Y,1),3)]; M(tf,5:end) = X(loc,5:end);

in order to get this:

M = [1001 1011 1001 10 130 0.8 0.2; % taken from X(1,5:end) 1001 1011 1001 11 nan nan nan; 1001 1011 1001 11 nan nan nan; 1001 1012 1001 11 150 0.2 0.8; % taken from X(2,5:end) 1001 1012 1001 11 150 0.2 0.8; % taken from X(2,5:end) 1001 1012 1001 11 150 0.2 0.8; % taken from X(2,5:end) 1001 1012 1002 11 131 0.5 0.5; % taken from X(3,5:end) 1001 1013 1002 11 140 0.6 0.4; % taken from X(4,5:end) 1004 1012 1005 12 nan nan nan]; %

but I get the error:

??? Subscript indices must either be real positive integers or logicals.

in the last line of my code.

Iro on 9 May 2013

Well I tried it with:

M(tf,5:end) = X(loc(tf),5:end);

instead, and it seems to work. However I don't really understand what is the difference between `loc and loc(tf)` in relation to the error above (real positive integer or logical)... any hints?

Andrei Bobrov on 10 May 2013

All right, use `loc(tf)` instead `loc`, because loc has nulls and is non logical type.

## 3 Comments

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/74810#comment_147760

Is there any way to do it (or something similar) with

and/or

Any other suggestions?

please, help!

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/74810#comment_147770

I'm not clear on how you derived M. Can you be very specific, where does each row in M come from?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/74810#comment_147782

M is the result I want to get with some function, derived from X an Y. More specifically, the four first columns come from Y's first 4 columsn while the rest 3 columns come from X's last three columns, in the case where the combinations of the first 4 column of Y are the same with combinations of X's first 4 columns... e.g: if M(i,1:4) is the same to any of X(j,1:4), then assign elements of X(j,5:7) to the M(i,5:end) by discarding the existing ones..

Let me know if it makes more sense now...Thanks!! :)