在单元格数组 Matlab 中乘以矩阵?



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

然后我有另一个叫做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的好方法?我已经尝试了参数输入的各种组合 - 但到目前为止没有运气。

要使用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数组连接到第三维,然后对其进行求和来完成的。

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

A = cellfun(FUN, B, C, ...) 使用 细胞阵列 B、C 的单元格、...作为输入参数。 (I,J,...)千 元素 A 等于 FUN(B{I,J,...}, C{I,J,...}, ...)。 B, C, ... 必须具有相同的大小。

因此,要么使用循环,要么在调用cellfun之前从具有大量元素的单元格中删除额外的元素:

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

最新更新