我有一个名为cell(1, n)
的{{1}}单元格数组,每个单元格条目都包含A
的矩阵。因此,实际上,我的单元格数组包含大小为mxn
的{{1}}矩阵。
然后我有另一个名为n
的单元格数组,其中存储了mxn
B
个矩阵。
我需要做的是将两者相互比较,如:n
,pxm
,...,A[1] * B[1]
。然后我需要将结果存储为他们自己的单个矩阵,并总结它们。
矩阵符合乘法,但因为单元格数组A[2] * B[2]
包含的行数少于单元格数组A[n] * B[n]
,所以当我使用B
时出现A
错误。< / p>
这似乎表明,当矩阵具有相同数量的行和列时,cellfun(@times A, B, 'UniformOutput', true)
只能乘以单个单元格。
现在,我可以通过使用各种循环,或通过调用unequal matrices
和cellfun
来执行此操作,依此类推。我也可以将所有内容存储为矩阵阵列而不是使用单元格...但是 - 我更喜欢使用单元格。
所以 - 我的问题是:有没有一种很好的方法只使用cell2mat
这样做?我已经尝试了各种参数输入组合 - 但到目前为止没有运气。
答案 0 :(得分:2)
要使用cellfun
执行此操作,只需定义您自己的匿名函数:
C = cellfun(@(a,b) a*b, A, B, 'UniformOutput', 0);
现在,当你提出问题时,你不能乘以A * B,因为内部维度不一致。相反,我用B * A测试了它,其中尺寸确实一致:p = 1,m = 3,n = 3.
A = {eye(3), rand(3), magic(3)};
B = {[1 2 3], [3 5 1], [7 8 8]};
C = cellfun(@(a,b) b*a, A, B, 'UniformOutput', 0);
Cmat = cat(3, C{:});
S = sum(Cmat, 3);
总和是通过将每个C
数组连接到第三维上然后对其求和来完成的。
答案 1 :(得分:2)
是的,参数必须大小相同。来自help cellfun
:
A = cellfun(FUN,B,C,...)使用的内容评估FUN 单元格数组B,C,...作为输入参数。 (I,J,...)th A的元素等于FUN(B {I,J,...},C {I,J,...},...)。 B,C,...... 必须都有相同的大小。
因此,在调用cellfun
之前,要么使用循环,要么使用大量元素从单元格中删除多余的元素:
% assuming B has more elements than A
B(numel(A)+1:end) = [];