单元数组Matlab中的乘法矩阵?

时间:2012-11-30 23:59:34

标签: matlab

我有一个名为cell(1, n)的{​​{1}}单元格数组,每个单元格条目都包含A的矩阵。因此,实际上,我的单​​元格数组包含大小为mxn的{​​{1}}矩阵。

然后我有另一个名为n的单元格数组,其中存储了mxn B个矩阵。

我需要做的是将两者相互比较,如:npxm,...,A[1] * B[1]。然后我需要将结果存储为他们自己的单个矩阵,并总结它们。

矩阵符合乘法,但因为单元格数组A[2] * B[2]包含的行数少于单元格数组A[n] * B[n],所以当我使用B时出现A错误。< / p>

这似乎表明,当矩阵具有相同数量的行和列时,cellfun(@times A, B, 'UniformOutput', true)只能乘以单个单元格。

现在,我可以通过使用各种循环,或通过调用unequal matricescellfun来执行此操作,依此类推。我也可以将所有内容存储为矩阵阵列而不是使用单元格...但是 - 我更喜欢使用单元格。

所以 - 我的问题是:有没有一种很好的方法只使用cell2mat这样做?我已经尝试了各种参数输入组合 - 但到目前为止没有运气。

2 个答案:

答案 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) = [];
相关问题