2012-11-30 66 views
6

我有一个单元阵列cell(1, n)A,每个单元格项包含mxn矩阵。所以,实际上,我的单​​元阵列包含大小为mxnn矩阵。在单元阵列Matlab中乘以矩阵?

然后我有另一个单元格阵列称为Bnpxm矩阵存储在其中。

我需要做的是将两者相互对立,如:A[1] * B[1],A[2] * B[2],...,A[n] * B[n]。然后,我需要将结果存储为各自的矩阵,并将其总结起来。

的矩阵是乘法共形,但由于单元阵列B含有比单元阵列A更少的行,当我使用cellfun(@times A, B, 'UniformOutput', true)我得到一个unequal matrices错误。

这似乎表明cellfun只能在矩阵具有相同数量的行和列时乘以单个单元格。

现在,我可以通过使用各种循环或通过调用cell2matmat2cell等来执行此操作。我也可以将所有东西都存储为矩阵数组,而不是使用单元格......但是我宁愿使用单元格。

所以 - 我的问题是:是否有一个很好的方式,只使用cellfun?我已经尝试过各种参数输入的组合 - 但目前为止没有运气。

回答

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各阵列上的第三尺寸然后求和完成它。

2

是的,参数需要是相同的大小。从help cellfun

A = cellfun(FUN,B,C,...),使用单元阵列B,C,...作为输入自变量的 单元的内容评价FUN。 A的(I,J,...)元素等于FUN(B {I,J,...},C {I,J,...},...)。 B,C,... 必须都具有相同的大小。

因此,无论使用循环,或元素的数量较多打电话cellfun之前从细胞中的多余的元素:

% assuming B has more elements than A 
B(numel(A)+1:end) = []; 
+0

不幸的是我不能在矩阵删除多余的列。单元格中的矩阵不均匀,即没有相同的维数,但是适合于乘法,两个单元阵列都具有节省数量的元素,只是矩阵不同,并且cellfun(@times ,,,,)不允许乘法运算地点。非常感谢答复,无论:) – James