我有一个名为A
的cell(1, n)
单元格数组,每个单元格条目都包含一个mxn
矩阵。因此,实际上,我的单元格数组包含大小为mxn
的矩阵n
。
然后我有另一个叫做B
的单元格数组,其中存储了n
pxm
矩阵。
我需要做的是将两者相乘,如:A[1] * B[1]
、A[2] * B[2]
、...、A[n] * B[n]
。然后,我需要将结果存储为自己的单个矩阵,并将它们相加。
矩阵对于乘法是共形的,但是因为单元格数组B
包含的行比单元格数组A
少,当我使用cellfun(@times A, B, 'UniformOutput', true)
时,我得到一个unequal matrices
错误。
这似乎表明,只有当矩阵具有相等的行数和列数时,cellfun
才能乘以单个单元格。
现在,我可以通过使用各种循环或调用cell2mat
和mat2cell
等来执行此操作。我也可以将所有内容存储为矩阵数组,而不是使用单元格......但是 - 我更喜欢使用单元格。
所以 - 我的问题是:有没有一种仅使用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) = [];