【问题标题】:How do I divide matrix elements by column sums in MATLAB?如何在 MATLAB 中将矩阵元素除以列和?
【发布时间】:2010-12-18 21:20:13
【问题描述】:

有没有一种简单的方法可以将每个矩阵元素除以列总和?例如:

input:

1  4

4  10

output:

1/5  4/14

4/5  10/14

【问题讨论】:

    标签: matlab matrix column-sum


    【解决方案1】:

    这里列出了执行此操作的不同方法...

    • ...使用bsxfun:

      B = bsxfun(@rdivide,A,sum(A));
      
    • ...使用repmat:

      B = A./repmat(sum(A),size(A,1),1);
      
    • ...使用outer product(由Amro 建议):

      B = A./(ones(size(A,1),1)*sum(A));
      
    • ...并使用 for 循环(如 mtrw 建议的那样):

      B = A;
      columnSums = sum(B);
      for i = 1:numel(columnSums)
        B(:,i) = B(:,i)./columnSums(i);
      end
      

    更新:

    从 MATLAB R2016b 及更高版本开始,大多数内置二进制函数(可以在 here 找到列表)支持隐式扩展,这意味着它们默认具有 bsxfun 的行为。因此,在最新的 MATLAB 版本中,您所要做的就是:

    B = A./sum(A);
    

    【讨论】:

    • 你不能为了完整性而加入循环吗? :)
    • 您可以将其添加到列表中:B = A ./ (ones(size(A,1),1)*sum(A,1))。我认为它比 repmat 快,但比 bsxfun
    • @Amro - 很好,我没想到那个。
    • 非常感谢大家的帮助。我很好奇哪种方法最快。相对执行时间是(应用于随机矩阵 3000x3000;实验重复 20 次;持续时间总和)最快的 bsxfun (1.00)、循环 (1.09)、ones (1.99)、repmat (2.06)。我将使用循环方法:-)。
    • 从 R2016b 开始,你可以只做 B = A./sum(A)。
    【解决方案2】:
    a=[1 4;4 10]
    a =
         1     4
         4    10
    
    a*diag(1./sum(a,1))
    ans =
        0.2000    0.2857
        0.8000    0.7143
    

    【讨论】:

    • +1,我喜欢这个。太糟糕了,它比 bsxfun 慢 20 倍。
    【解决方案3】:

    忍不住尝试列表推导。如果此矩阵以行优先列表的形式表示,请尝试以下操作:

    >>> A = [[1,4],[4,10]]
    >>> [[float(i)/j for i,j in zip(a,map(sum,zip(*A)))] for a in A]
    [[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]
    

    是的,我知道这不是超级高效,因为我们每行计算一次列总和。将其保存在名为 colsums 的变量中,如下所示:

    >>> colsums = map(sum,zip(*A))
    >>> [[float(i)/j for i,j in zip(a,colsums)] for a in A]
    [[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]
    

    注意 zip(*A) 给出转置(A)。

    【讨论】:

    • 哦,对不起,是的。我没有注意到 Matlab 标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多