6

我有一个cell(1, n)被调用的单元格数组A,每个单元格条目都包含一个mxn. 因此,实际上,我的元胞数组包含nsize 的矩阵mxn

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

我需要做的是将两者相乘,如:A[1] * B[1], A[2] * B[2], ..., A[n] * B[n]。然后我需要将结果存储为它们自己的单个矩阵,并将它们总结起来。

矩阵对于乘法是保形的,但是因为 cell arrayB包含的行数少于 cell array A,所以当我使用时cellfun(@times A, B, 'UniformOutput', true)出现unequal matrices错误。

这似乎表明,cellfun当矩阵的行数和列数相等时,只能乘以单个单元格。

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

所以 - 我的问题是:有没有一种好方法可以做到这一点cellfun?我已经尝试过各种参数输入组合 - 但到目前为止还没有运气。

4

2 回答 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超过第三维的每个数组然后对其求和来完成的。

于 2012-12-01T00:24:26.287 回答
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) = [];
于 2012-12-01T09:32:51.047 回答