我有一个3d(或一般是n维)矩阵A
,其尺寸为
size(A) = [d1 d2 d3 ... dn].
现在我想在其中一个维度上使用列向量v
进行向量乘法(就像我在2维中所做的那样,我得到一个向量返回 - 例如d1 = 2
, d3 = 4
和size(v) = d2
),以便
(A*d)_i = sum(a_ij*v_j).
因此我希望减少一个维度。
是否有一个Matlab函数(除了循环)返回d3
- 维列向量v
(A*v)_ij = sum(A_ijk*v_k).
我希望这很清楚。
谢谢!
答案 0 :(得分:3)
你可以用一些reshape
来做到这一点:
A=rand(2,3,4);
v=rand(1,4);
reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)])
基本上,您将A重塑为2D矩阵A2((ij),(k))= A((i),(j),(k)):
A2=reshape(A,[size(A,1)*size(A,2),size(A,3)])
然后你进行常规的多重化:
for all(ij)B2((ij))= sum_k A2((ij),(k))* v((k)):
B2=A2*v
你重塑:
B((I),(J))= B((IJ))
B=reshape(B2,[size(A,1) size(A,2)])
我希望这很清楚
答案 1 :(得分:3)
你可以做得更顺畅一点。对于矩阵reshape
,只需要1个参数,如果没有指定则另一个自动计算,这在这种情况下非常有用。
因此,Oli提出的解决方案可以简单地写成
A = rand(2,3,4);
v = rand(4,1);
A2 = reshape(A, [], numel(v)); % flatten first two dimensions
B2 = A2*v;
B = reshape(B2, size(A, 1), []);