如何在MATLAB中按列总和划分矩阵元素?

时间:2009-11-20 20:37:28

标签: matlab matrix column-sum

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

input:

1  4

4  10

output:

1/5  4/14

4/5  10/14

3 个答案:

答案 0 :(得分:42)

以下列出了执行此操作的不同方法......

  • ...使用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);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

无法抗拒尝试列表理解。如果此矩阵表示在行主列表中,请尝试以下操作:

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