MATLAB 矩阵列减法
MATLAB Matrix column subtraction
我正在努力解决以下问题。
我有 2 个矩阵,假设 A 和 B 的维度可以随时间变化,我想创建一个新的矩阵 C,如下所示:
我想从矩阵 A 中的所有列中减去矩阵 B 中的所有列。例如,如果矩阵 A 是 [1 2;5 6;8 5] 和矩阵 B [2 2;2 1;3 5 ],那么矩阵 C 将是 [1-2 1-2 2-2 2-2;5-2 5-1 6-2 6-1;8-3 8-5 5-3 5-5].
这段代码我试过了,但是哪里有错误,我找不到。您能否更正代码以使其正常工作或提供更好的解决方案以获得正确的结果?
matrixA=[4 5; 4 7;9 6];
matrixB=[3 6 4;5 8 9;4 1 2];
[m,n]=size(matrixA);
[o,p]=size(matrixB);
C = zeros(m,n*p);
for p = 1:n
for q = 1:p
C(:,3*p+q-3) = matrixA(:,p)-matrixB(:,q);
end
end
我没有查看您的代码,但您可以使用 permute
, bsxfun
, reshape
:
来更简单地进行矢量化
A = [1 2;5 6;8 5];
B = [2 2;2 1;3 5];
C = reshape(bsxfun(@minus, permute(A, [1 3 2]), B), size(A,1), []);
从 R2016b 开始 bsxfun
是 not necessary:
C = reshape(permute(A, [1 3 2]) - B, size(A,1), []);
你的 column-wise 个大小相等的矩阵的例子很容易处理:
matrixA = [1 2; 5 6; 8 5];
matrixB = [2 2; 2 1; 3 5];
A = repelem(matrixA,1,2);
B = repmat(matrixB,1,2);
C = A - B
C =
-1 -1 0 0
3 4 4 5
5 3 2 0
但是为了处理不匹配的列大小,事情变得有点复杂:
matrixA = [1 2; 5 6; 8 5];
matrixB = [2 2; 2 1; 3 5];
A = repelem(matrixA,1,size(matrixB,2));
B = repmat(matrixB,1,size(matrixA,2));
C = (B - A) .* -1
C =
-1 -1 0 0
3 4 4 5
5 3 2 0
matrixA = [4 5; 4 7; 9 6];
matrixB = [3 6 4; 5 8 9; 4 1 2];
A = repelem(matrixA,1,size(matrixB,2));
B = repmat(matrixB,1,size(matrixA,2));
C = (B - A) .* -1
C =
1 -2 0 2 -1 1
-1 -4 -5 2 -1 -2
5 8 7 2 5 4
我正在努力解决以下问题。
我有 2 个矩阵,假设 A 和 B 的维度可以随时间变化,我想创建一个新的矩阵 C,如下所示:
我想从矩阵 A 中的所有列中减去矩阵 B 中的所有列。例如,如果矩阵 A 是 [1 2;5 6;8 5] 和矩阵 B [2 2;2 1;3 5 ],那么矩阵 C 将是 [1-2 1-2 2-2 2-2;5-2 5-1 6-2 6-1;8-3 8-5 5-3 5-5].
这段代码我试过了,但是哪里有错误,我找不到。您能否更正代码以使其正常工作或提供更好的解决方案以获得正确的结果?
matrixA=[4 5; 4 7;9 6];
matrixB=[3 6 4;5 8 9;4 1 2];
[m,n]=size(matrixA);
[o,p]=size(matrixB);
C = zeros(m,n*p);
for p = 1:n
for q = 1:p
C(:,3*p+q-3) = matrixA(:,p)-matrixB(:,q);
end
end
我没有查看您的代码,但您可以使用 permute
, bsxfun
, reshape
:
A = [1 2;5 6;8 5];
B = [2 2;2 1;3 5];
C = reshape(bsxfun(@minus, permute(A, [1 3 2]), B), size(A,1), []);
从 R2016b 开始 bsxfun
是 not necessary:
C = reshape(permute(A, [1 3 2]) - B, size(A,1), []);
你的 column-wise 个大小相等的矩阵的例子很容易处理:
matrixA = [1 2; 5 6; 8 5];
matrixB = [2 2; 2 1; 3 5];
A = repelem(matrixA,1,2);
B = repmat(matrixB,1,2);
C = A - B
C =
-1 -1 0 0
3 4 4 5
5 3 2 0
但是为了处理不匹配的列大小,事情变得有点复杂:
matrixA = [1 2; 5 6; 8 5];
matrixB = [2 2; 2 1; 3 5];
A = repelem(matrixA,1,size(matrixB,2));
B = repmat(matrixB,1,size(matrixA,2));
C = (B - A) .* -1
C =
-1 -1 0 0
3 4 4 5
5 3 2 0
matrixA = [4 5; 4 7; 9 6];
matrixB = [3 6 4; 5 8 9; 4 1 2];
A = repelem(matrixA,1,size(matrixB,2));
B = repmat(matrixB,1,size(matrixA,2));
C = (B - A) .* -1
C =
1 -2 0 2 -1 1
-1 -4 -5 2 -1 -2
5 8 7 2 5 4