vectores una suma seleccionar posicion matriz matrices extraer elementos columna agregar matlab matrix column-sum

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