Azzera filtri
Azzera filtri

compare matrices with different dimension

1 visualizzazione (ultimi 30 giorni)
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

Risposta accettata

Stephen23
Stephen23 il 10 Gen 2015
Modificato: Stephen23 il 11 Gen 2015
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 Commento
gianluca
gianluca il 12 Gen 2015
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!

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 10 Gen 2015
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.

Categorie

Scopri di più su Animation in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by