在Matlab中如何在单元数组中相乘矩阵?

6
我有一个单元格数组cell(1, n),称为A,其中每个单元格条目包含一个大小为mxn的矩阵。因此,实际上,我的单元格数组包含n个大小为mxn的矩阵。
然后我有另一个单元格数组,称为B,其中存储了npxm矩阵。
我需要做的是将它们相乘,如: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个回答

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) = [];

很遗憾,我无法删除矩阵中的额外列。单元格中的矩阵是不均匀的,即它们的维度不相同,但它们符合乘法条件。两个单元格数组具有相同数量的元素,只是矩阵不同,而cellfun(@times ,,,,)不允许进行乘法运算。无论如何,非常感谢您的回复 :) - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接