【问题标题】:Multiply matrices in cell array Matlab?将单元格数组Matlab中的矩阵相乘?
【发布时间】:2012-11-30 23:59:33
【问题描述】:

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

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

    要使用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、... 的元胞作为输入参数。 (I,J,...)th A 的元素等于 FUN(B{I,J,...}, C{I,J,...}, ...)。乙、丙、... 必须都具有相同的大小。

      所以要么使用循环,要么在调用cellfun之前从元素数量较多的单元格中删除多余的元素:

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

      【讨论】:

      • 不幸的是,我无法删除矩阵中的额外列。单元格中的矩阵是不均匀的,即没有相同的维度,但是对于乘法是保形的,两个单元格数组都有保存的元素数量,只是矩阵不同并且 cellfun(@times ,,,,) 不允许乘法地方。非常感谢您的回复:)
      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多