una - ¿Cómo divido los elementos de la matriz por sumas de columna en MATLAB?
suma de matrices matlab (3)
Aquí hay una lista de las diferentes maneras de hacer esto ...
... utilizando
bsxfun
:B = bsxfun(@rdivide,A,sum(A));
... utilizando
repmat
:B = A./repmat(sum(A),size(A,1),1);
... usando un producto externo (como lo sugiere Amro ):
B = A./(ones(size(A,1),1)*sum(A));
... y usando un bucle for (como lo sugiere mtrw ):
B = A; columnSums = sum(B); for i = 1:numel(columnSums) B(:,i) = B(:,i)./columnSums(i); end
Actualizar:
A partir de MATLAB R2016b y posteriores, la mayoría de las funciones binarias integradas (la lista se puede encontrar here ) admiten la expansión implícita, lo que significa que tienen el comportamiento de bsxfun
de forma predeterminada. Entonces, en las nuevas versiones de MATLAB, todo lo que tienes que hacer es:
B = A./sum(A);
¿Hay una manera fácil de dividir cada elemento de la matriz por la suma de la columna? Por ejemplo:
input:
1 4
4 10
output:
1/5 4/14
4/5 10/14
No pude resistirme a intentar una lista de comprensión. Si esta matriz estaba representada en una lista de listas de filas principales, intente esto:
>>> 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]]
Sí, sé que esto no es supereficiente, ya que calculamos las sumas de las columnas una vez por fila. Guardar esto en una variable llamada colsums se ve así:
>>> 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]]
Tenga en cuenta que zip (* A) da transposición (A).
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