在MATLAB中,如何用列和划分矩阵元素?

在MATLAB中,如何用列和划分矩阵元素?,matlab,matrix,column-sum,Matlab,Matrix,Column Sum,是否有一种简单的方法将每个矩阵元素除以列和?例如: input: 1 4 4 10 output: 1/5 4/14 4/5 10/14 下面是一个不同方法的列表 。。。使用: 。。。使用: 。。。使用(如建议的): 。。。并使用for循环(如所建议的): 更新: 从MatlabR2016B及更高版本开始,大多数内置二进制函数(可以找到列表)都支持隐式扩展,这意味着默认情况下它们具有的行为。因此,在最新的MATLAB版本中,您需要做的就是: B = A./sum(

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

input:

1  4

4  10

output:

1/5  4/14

4/5  10/14

下面是一个不同方法的列表

  • 。。。使用:

  • 。。。使用:

  • 。。。使用(如建议的):

  • 。。。并使用for循环(如所建议的):

更新:

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

B = A./sum(A);

情不自禁地尝试列表理解。如果此矩阵在列表的行主列表中表示,请尝试以下操作:

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

您不能为了完整性而加入循环吗?:)您可以将其添加到列表中:
B=A./(个数(大小(A,1),1)*和(A,1))
。我认为它比repmat快,但比repmat慢bsxfun@Amro-很好,我没想到这个。非常感谢你们的帮助。我很好奇哪种方法最快。相对执行时间(应用于随机矩阵3000x3000;实验重复20次;持续时间求和)最快的bsxfun(1.00)、循环(1.09)、1(1.99)、repmat(2.06)。我将使用循环方法:-)。由于R2016b,您可以只执行B=A./sum(A)。哦,对不起,是的。我没有注意到Matlab标记。+1,我喜欢这个。太糟糕了,它比
bsxfun
慢20倍。
B = A;
columnSums = sum(B);
for i = 1:numel(columnSums)
  B(:,i) = B(:,i)./columnSums(i);
end
B = A./sum(A);
>>> 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 = 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]]
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