Subtracting Matrices in Special way

조회 수: 1 (최근 30일)
A
A 2021년 12월 1일
답변: Stephen23 2021년 12월 2일
I have a Matrices as:
A=[1 10 12;2 12 3; 3 15 4; 4 16 7; 5 18 9; 6 10 10; 7 12 9; 9 5 6];
B=[3 9 8; 4 8 3; 5 2 5; 7 10 2; 8 9 7; 8 9 7; 9 12 10; 10 5 6];
Where Colum 1 is the index Colum 2 is the x and Colum 3 is the y. I would like to match each index of the 2 matrices and subtract the x and y values. The solution should be something like this:
C=[1 10 12; 2 12 3; 3 6 -4; 4 8 4; 5 16 4; 6 10 10; 7 2 7; 8 -9 -7; 9 -7 -4; 10 -5 -6]
How would I do this?

채택된 답변

Ive J
Ive J 2021년 12월 1일
There should be a simpler way, but this works:
A=[1 10 12;2 12 3; 3 15 4; 4 16 7; 5 18 9; 6 10 10; 7 12 9; 9 5 6];
B=[3 9 8; 4 8 3; 5 2 5; 7 10 2; 8 9 7; 8 9 7; 9 12 10; 10 5 6];
% build a new matrix from union of indices
idx = union(A(:, 1), B(:, 1));
D = [idx, zeros(numel(idx), 2)];
% fill x and y for shared indices between A and B
[fa, fb] = ismember(A(:, 1), B(:, 1));
fd = ismember(idx, A(fa, 1));
D(fd, 2:3) = A(fa, 2:3) - B(fb(fa), 2:3);
% fill the remaining rows in D
A(fa, :) = []; B(fb(fa), :) = []; % don't need them anymore!
[fd, fa] = ismember(idx, A(:, 1));
D(fd, 2:3) = A(fa(fd), 2:3);
[fd, fb] = ismember(idx, B(:, 1));
D(fd, 2:3) = D(fd, 2:3) - B(fb(fd), 2:3);
% check if D is same as C
C=[1 10 12; 2 12 3; 3 6 -4; 4 8 4; 5 16 4; 6 10 10; 7 2 7; 8 -9 -7; 9 -7 -4; 10 -5 -6];
all(D == C, 'all')
ans = logical
1

추가 답변 (1개)

Stephen23
Stephen23 2021년 12월 2일
If the A values are copied first then only two ISMEMBER are required (simpler, more efficient), nor any resizing or changing of the A & B arrays (more efficient, and in general changing raw input data is best avoided):
A = [1,10,12;2,12,3;3,15,4;4,16,7;5,18,9;6,10,10;7,12,9;9,5,6]
A = 8×3
1 10 12 2 12 3 3 15 4 4 16 7 5 18 9 6 10 10 7 12 9 9 5 6
B = [3,9,8;4,8,3;5,2,5;7,10,2;8,9,7;8,9,7;9,12,10;10,5,6]
B = 8×3
3 9 8 4 8 3 5 2 5 7 10 2 8 9 7 8 9 7 9 12 10 10 5 6
X = union(A(:,1), B(:,1));
D = [X,zeros(numel(X),2)];
% Copy A values:
[Xd,Xa] = ismember(X,A(:,1));
D(Xd,2:3) = A(Xa(Xd),2:3);
% Subtract B values:
[Xd,Xb] = ismember(X,B(:,1));
D(Xd,2:3) = D(Xd,2:3) - B(Xb(Xd),2:3)
D = 10×3
1 10 12 2 12 3 3 6 -4 4 8 4 5 16 4 6 10 10 7 2 7 8 -9 -7 9 -7 -4 10 -5 -6
% Compare:
C = [1,10,12;2,12,3;3,6,-4;4,8,4;5,16,4;6,10,10;7,2,7;8,-9,-7;9,-7,-4;10,-5,-6];
isequal(C,D)
ans = logical
1

카테고리

Help CenterFile Exchange에서 Introduction to Installation and Licensing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by