【发布时间】:2019-02-27 09:49:13
【问题描述】:
假设我有一个维度为 [4x4] 的矩阵和一个 [16x1] 的向量,我需要将向量中的每 4 个元素乘以矩阵中的一个元素,(而不是逐行乘以向量中的元素),如何使用循环来做到这一点?
例如下面,结果向量中前四个元素的结果如下例所示,那么矩阵中的第二、第三和第四行也是如此。 :
所以该示例中的结果应该是 [16x1]
谢谢
【问题讨论】:
假设我有一个维度为 [4x4] 的矩阵和一个 [16x1] 的向量,我需要将向量中的每 4 个元素乘以矩阵中的一个元素,(而不是逐行乘以向量中的元素),如何使用循环来做到这一点?
例如下面,结果向量中前四个元素的结果如下例所示,那么矩阵中的第二、第三和第四行也是如此。 :
所以该示例中的结果应该是 [16x1]
谢谢
【问题讨论】:
使用kron,您可以使用这个单行:
%A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
%v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';
sum(kron(A,ones(4,4)).'.*v).'/4
我使用克罗内克张量积来“复制” 4x4 时间的 A 矩阵。之后就是纯代数了。
【讨论】:
这只是变相的矩阵乘法...如果您的 tall 向量是与所示矩阵大小相同的矩阵,其中每个突出显示的块都是一行,则它是矩阵乘法。我们可以设置它,然后重新整形为向量。
您可以使用索引将其转换为简单的矩阵乘法。我今天已经answered 提出了一个问题,详细说明了使用bsxfun 进行以下索引的工作原理,然后我们只是在最后reshape:
% Setup
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';
% Matrix mutliplication
r = numel(v)/size(A,1);
b = A * v( bsxfun( @plus, (1:r:numel(v)).', 0:r-1 ) );
% Make result a column vector
b = reshape( b.', [], 1 );
【讨论】:
看看这是不是你想要的:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';
r = reshape(sum(bsxfun(@times, permute(A, [3 2 1]), permute(reshape(v, 1, [], size(A,2)), [2 3 1])), 2), [], 1);
给了
r =
17
17
17
17
41
41
41
41
65
65
65
65
89
89
89
89
【讨论】:
我假设了一些细节,但这应该可以解决问题:
A=reshape(1:16,4,4).';
b=repelem([2,0,1,3],1,4).';
c=[];
for row=1:size(A,1)
c=[ c; sum(reshape(repelem(A(row,:),4).*b.',4,[]),2)];
end
我在这里假设您的向量演示只是一个不好的示例,并且您不会有重复的值,否则可以通过不进行 3/4 的乘法来实现更简单的版本。
如果您无法访问repelem,请查看执行相同操作的替代代码:Element-wise array replication in Matlab
【讨论】: