代码之家  ›  专栏  ›  技术社区  ›  danatel

在matlab中,如何将矩阵元素除以列和?

  •  20
  • danatel  · 技术社区  · 15 年前

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

    input:
    
    1  4
    
    4  10
    
    output:
    
    1/5  4/14
    
    4/5  10/14
    
    3 回复  |  直到 8 年前
        1
  •  42
  •   Community CDub    7 年前

    这里有一个不同方法的列表…

    • …使用 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 )支持隐式扩展,这意味着它们具有 比斯芬奇 默认情况下。因此,在最新的matlab版本中,您需要做的就是:

    B = A./sum(A);
    
        2
  •  1
  •   Stewie Griffin    11 年前
    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
    
        3
  •  0
  •   PaulMcG    15 年前

    忍不住试着理解清单。如果此矩阵表示在一行主要列表中,请尝试以下操作:

    >>> 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)。