Arrays 在Matlab中如何将矩阵与单元阵列的每个单元相乘?
我有一个4D数组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
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
沿着第五或第六维度移动然后转置-感觉不对,我担心这可能需要大量内存复制。这当然是交易。但对我来说,如果涉及数值计算,我会尽可能快地得到非单元数组。所以我认为即使是第五个昏暗的猫也值得努力。这让我好奇,下面是一些快速运行时结果-