【发布时间】:2010-12-18 21:20:13
【问题描述】:
有没有一种简单的方法可以将每个矩阵元素除以列总和?例如:
input:
1 4
4 10
output:
1/5 4/14
4/5 10/14
【问题讨论】:
标签: matlab matrix column-sum
有没有一种简单的方法可以将每个矩阵元素除以列总和?例如:
input:
1 4
4 10
output:
1/5 4/14
4/5 10/14
【问题讨论】:
标签: matlab matrix column-sum
这里列出了执行此操作的不同方法...
...使用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 慢
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
【讨论】:
bsxfun 慢 20 倍。
忍不住尝试列表推导。如果此矩阵以行优先列表的形式表示,请尝试以下操作:
>>> 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)。
【讨论】: