Arrays 在Matlab中如何将矩阵与单元阵列的每个单元相乘?

Arrays 在Matlab中如何将矩阵与单元阵列的每个单元相乘?,arrays,matlab,cell,product,Arrays,Matlab,Cell,Product,我有一个4D数组asize(l,k,s,r)和一个单元格数组Bsize(I,j),其中每个单元格中存储了不同的4D数组的系数大小(l,k,s,r) 我想在给定数组C中对大小(I,j)=C(I,j)+sum(sum(sum(sum(sum(A.*B{I,j})))进行更改,而不使用for循环 换句话说,我需要从单元格数组B中逐个提取所有数组,并与A相乘 对于for循环,我是这样做的: for i=1:length_of_first_dimension for j=1:length_of_s

我有一个4D数组
a
size(l,k,s,r)和一个单元格数组
B
size(I,j),其中每个单元格中存储了不同的4D数组的系数大小(l,k,s,r)

我想在给定数组
C
中对大小(I,j)=
C(I,j)+sum(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;
有人能帮我吗?

首先,
B
变成
(第一维的长度*第二维的长度)
-by-
l*k*s*r
2D矩阵

rB = cellfun( @(x) x(:).', B, 'uni', 0 ); %'
rB = vertcat(rB{:});
现在,
A
重塑为
l*k*s*r
-by-1列向量

rA = A(:);
然后简单地将它们相乘

rDummy = rB * rA; %// does the elem-wise product and summation quite quickly.  
重塑结果

dummy = reshape(rDummy, size(B) );
C = C + dummy;

正如
重塑
B
的更有效方法所指出的那样

rB = reshape( cat( 5, B{:} ), numel(A), [] ).';

可以找到一个小的基准。

您能提供更多关于我可以这样做的详细信息吗?我到底应该改造什么?是的。应该很有效。@Divakar谢谢<代码>重塑
应该相当有效,但我担心
vertcat
可能会导致大内存拷贝。考虑重塑和排列时可能值得考虑,这样点积将是
rA*rB
…实际上,我认为您可以避免
cellfun
,这可能是使用此-
rB=reformate(cat(5,B{:}),numel(A),[])最慢的部分之一。无论如何,你必须在某处使用一个
cat
s。在你有了这个
rB
之后,剩下的代码就应该处理好了。@Divakar我害怕
cat
沿着第五或第六维度移动然后转置-感觉不对,我担心这可能需要大量内存复制。这当然是交易。但对我来说,如果涉及数值计算,我会尽可能快地得到非单元数组。所以我认为即使是第五个昏暗的猫也值得努力。这让我好奇,下面是一些快速运行时结果-