フィルターのクリア

compare matrices with different dimension

1 回表示 (過去 30 日間)
gianluca
gianluca 2015 年 1 月 10 日
コメント済み: gianluca 2015 年 1 月 12 日
Hi,
A = [100123 1 1 50;
100123 1 2 53;
100123 1 3 55;
100456 2 1 78;
100456 2 2 75;
100789 1 1 80]
B = [100123 1 56;
100456 2 76]
Comparing the 1st and 2nd columns of A and B, I've to compute the difference between each value in the 4th comlumn of A and the values in the 3th column of B.
In the case to compute (A - B), the expected result is a Matrix as
C = [100123 1 1 -6;
100123 1 2 -3;
100123 1 3 -1;
100456 2 1 2;
100456 2 2 -1]
Tnx for any suggestion

採用された回答

Stephen23
Stephen23 2015 年 1 月 10 日
編集済み: Stephen23 2015 年 1 月 11 日
You could try this:
>> X = bsxfun(@eq,A(:,1).',B(:,1));
>> Y = bsxfun(@minus,A(:,4).',B(:,3));
>> Z = [A(any(X,1),1:3),Y(X)]
Z =
100123 1 1 -6
100123 1 2 -3
100123 1 3 -1
100456 2 1 2
100456 2 2 -1
It returns only the rows of A for which the first element matches any first row element in B, and in the last column gives the difference of corresponding end elements of A and B.
  1 件のコメント
gianluca
gianluca 2015 年 1 月 12 日
Thanks Stephen,
your code worked well. As my original data are a little different than the example I've posted, I've added to your code a further logical operation to select the data that have the same key (1st col) and the same number (2nd col). Finally the following code works well for my purpose:
X1 = bsxfun(@eq,A(:,1).',B(:,1));
X2 = bsxfun(@eq,A(:,2).',B(:,2));
X = X1.*X2;
X = logical(X);
Y = bsxfun(@minus,A(:,4).',B(:,3));
Z = [A(any(X,1),1:3),Y(X)];
Your advices have been very useful!

サインインしてコメントする。

その他の回答 (1 件)

Image Analyst
Image Analyst 2015 年 1 月 10 日
Try this:
A = [100123 1 1 50;
100123 1 2 53;
100123 1 3 55;
100456 2 1 78;
100456 2 2 75;
100789 1 1 80]
B = [100123 1 56;
100456 2 76]
[rowsA, colA] = size(A);
[rowsB, colB] = size(B);
B_rep = [repmat(B(1,:), [rowsA/rowsB, 1]); repmat(B(2,:), [rowsA/rowsB, 1])]
C = A; % Initialize
C(:, 4) = A(:, 4) - B_rep(:, 3)
However I get:
C =
100123 1 1 -6
100123 1 2 -3
100123 1 3 -1
100456 2 1 2
100456 2 2 -1
100789 1 1 4
Since you, for some reason , want the last row cropped off of C, you can then do this:
C = C(1:end-1,:)
to get exactly what you listed.

カテゴリ

Help Center および File ExchangeAnimation についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by