我有一个4D数组A
大小(l,k,s,r)和一个单元数组B
size(i,j),其中每个单元格中有一个不同的4D系数大小(存储l,k,s,r。
我希望在没有C
循环的情况下对大小(i,j)= C(i,j) + sum(sum(sum(sum(A.*B{i,j}))))
的给定数组for
进行更改。
换句话说,我需要逐个从单元格数组B
中提取所有数组并与A
相乘。
使用for循环我这样做:
for i=1:length_of_first_dimension
for j=1:length_of_second_dimension
B_4D=B{i,j}; % extraction of 4D array
dummy(i,j)=sum(sum(sum(sum(B_4D.*A))));
end
end
C=C+dummy;
任何人都可以帮助我吗?
答案 0 :(得分:2)
首先,reshape
B
加入(length_of_first_dimension*length_of_second_dimension)
- by - l*k*s*r
2D矩阵
rB = cellfun( @(x) x(:).', B, 'uni', 0 ); %'
rB = vertcat(rB{:});
现在,reshape
A
加入l*k*s*r
- 1列向量
rA = A(:);
简单地将它们相乘
rDummy = rB * rA; %// does the elem-wise product and summation quite quickly.
重塑结果
dummy = reshape(rDummy, size(B) );
C = C + dummy;
正如Divakar所指出的,reshape
B
更有效的方法是
rB = reshape( cat( 5, B{:} ), numel(A), [] ).';
可以找到一个小基准here。