我有一个名为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就能做到这一点的好方法?我已经尝试过各种不同的参数输入组合--但到目前为止还没有成功。
发布于 2012-12-01 08:24:26
要使用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-01 17:32:51
是的,参数需要具有相同的大小。来自help cellfun
A= cellfun(FUN,B,C,...)使用单元格数组B,C,...的单元格内容计算有趣。作为输入参数。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) = [];https://stackoverflow.com/questions/13654910
复制相似问题