2011-05-11 21 views
8

duplicados posibles:
How to subtract a vector from each row of a matrix?
How can I divide each row of a matrix by a fixed row?Matlab - restar rápidamente [1xN] Array de [MxN] elementos de matriz

I tienen matriz (M1) de M filas y 4 columnas . Tengo otra matriz (M2) de 1 fila y 4 columnas. Me gustaría restar cada elemento en M1 por su elemento de columna respectivo en M2. En otras palabras, cada columna de M1 necesita ser subtraída por el escalar en la misma posición de columna en M2. Podría llamar repmat(M2,M,1), lo que crearía una matriz NUEVO de tamaño MxN, donde cada elemento en una columna era la misma, y ​​luego hacer un elemento por elemento resta:

M2new = repmat(M2,M,1) 
final = M1 - M2new 

, sin embargo, esto es dos líneas de código y crea un nuevo elemento en la memoria. ¿Cuál es la forma más rápida y menos intensiva de memoria de realizar esta operación?

+1

Duplicado: [¿Cómo restar un vector de cada fila de una matriz?] (Http://stackoverflow.com/questions/5342857/how-to-subtract-a-vector-from-each-row-of- a-matrix) ... que a su vez era un duplicado de estos (con una operación aritmética diferente): [¿Cómo se dividen los elementos de la matriz por sumas de columna en MATLAB?] (http://stackoverflow.com/questions/1773099/ cómo-do-i-divide-matriz-elementos-por-columna-sumas-en-matlab), [¿Cómo puedo dividir cada fila de una matriz por una fila fija?] (http://stackoverflow.com/questions/ 4723824/how-can-i-divide-each-row-of-a-matrix-by-a-fixed-row) ... Parece ser un problema muy común. ;) – gnovice

Respuesta

14

Use bsxfun como en el siguiente ejemplo.

x=magic(4); 
y=x(1,:); 
z=bsxfun(@minus,x,y) 

z = 

    0  0  0  0 
    -11  9  7 -5 
    -7  5  3 -1 
    -12 12 12 -12 

Aquí z se obtiene restando la primera fila de cada fila. Simplemente reemplace x con su matriz y y con su vector de fila, y ya tiene todo listo.

14

bsxfun(.) puede ser potencialmente más eficiente, pero en lo personal como un viejo contador de tiempo, voy a recomendaría no ignorar totalmente las soluciones basadas en álgebra lineal, como:

> M1= magic(4) 
M1 = 
    16 2 3 13 
    5 11 10 8 
    9 7 6 12 
    4 14 15 1 
> M2= M1(1, :) 
M2 = 
    16 2 3 13 
> M1- ones(4, 1)* M2 
ans = 
    0 0 0 0 
    -11 9 7 -5 
    -7 5 3 -1 
    -12 12 12 -12 

Deje que el caso de uso real y un perfilador para decidir la funcionalidad realmente utilizada.