Puede aplicar una función a cada elemento en un vector diciendo, por ejemplo v + 1
,, o puede usar la función arrayfun
. ¿Cómo puedo hacerlo para cada fila / columna de una matriz sin usar un bucle for?
matlab
function
matrix
vectorization
FurtiveFelon
fuente
fuente
true = false
hay una declaración válida, estoy seguro de que hay una forma de hacerlo (:sum(M, 1)
. Los principiantes pueden pensar quesum
se puede usar de esta manera para matrices de tamaño arbitrario y luego quedar perplejos cuando la matriz lo sea un día1-by-n
.Es posible que desee la función bsxfun de Matlab, más oscura . De la documentación de Matlab, bsxfun "aplica la operación binaria elemento por elemento especificada por la función handle fun a las matrices A y B, con la expansión singleton habilitada".
@gnovice indicó anteriormente que la suma y otras funciones básicas ya operan en la primera dimensión que no es singleton (es decir, filas si hay más de una fila, columnas si solo hay una fila, o dimensiones más altas si todas las dimensiones inferiores tienen tamaño == 1 ). Sin embargo, bsxfun funciona para cualquier función, incluidas (y especialmente) las funciones definidas por el usuario.
Por ejemplo, digamos que tiene una matriz A y un vector fila BEg, digamos:
Quieres una función power_by_col que devuelva en un vector C todos los elementos en A a la potencia de la columna correspondiente de B.
En el ejemplo anterior, C es una matriz de 3x3:
es decir,
Podrías hacer esto por la fuerza bruta usando repmat:
O puede hacer esto de la manera elegante usando bsxfun, que internamente se encarga del paso repmat:
Entonces, bsxfun le ahorra algunos pasos (no necesita calcular explícitamente las dimensiones de A). Sin embargo, en algunas pruebas informales mías, resulta que repmat es aproximadamente el doble de rápido si la función que se va a aplicar (como mi función de potencia, arriba) es simple. Por lo tanto, deberá elegir si desea simplicidad o velocidad.
fuente
No puedo comentar qué tan eficiente es esto, pero aquí hay una solución:
fuente
Sobre la base de la respuesta de Alex , aquí hay una función más genérica:
Aquí hay una comparación entre las dos funciones:
fuente
Para completar / interesar, me gustaría agregar que matlab tiene una función que le permite operar con datos por fila en lugar de por elemento. Se llama
rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ), pero el único "problema" es que opera en tablas ( http://www.mathworks.se/help/ matlab / ref / table.html ) en lugar de matrices .fuente
Además de la naturaleza evolutiva de la respuesta a esta pregunta, comenzando con r2016b, MATLAB expandirá implícitamente las dimensiones singleton, eliminando la necesidad de
bsxfun
en muchos casos.De las notas de la versión r2016b :
fuente
Ninguna de las respuestas anteriores funcionó "fuera de la caja" para mí, sin embargo, la siguiente función, obtenida al copiar las ideas de las otras respuestas, funciona:
Toma una función
f
y la aplica a cada columna de la matrizM
.Así por ejemplo:
fuente
Con las versiones recientes de Matlab, puede utilizar la estructura de datos de la tabla a su favor. Incluso hay una operación 'rowfun', pero me resultó más fácil hacer esto:
o aquí hay uno más antiguo que tenía que no requiere tablas, para versiones anteriores de Matlab.
fuente
La respuesta aceptada parece ser convertir primero a celdas y luego usar
cellfun
para operar sobre todas las celdas. No conozco la aplicación específica, pero en general creo que usarbsxfun
para operar sobre la matriz sería más eficiente. Básicamente,bsxfun
aplica una operación elemento por elemento en dos matrices. Entonces, si quisiera multiplicar cada elemento en unn x 1
vector por cada elemento en unm x 1
vector para obtener unan x m
matriz, podría usar:Esto le dará una matriz llamada
result
en la que la entrada (i, j) será el i-ésimo elemento devec1
multiplicado por el j-ésimo elemento devec2
.Puede utilizarlo
bsxfun
para todo tipo de funciones integradas y puede declarar las suyas propias. La documentación tiene una lista de muchas funciones integradas, pero básicamente puede nombrar cualquier función que acepte dos matrices (vector o matriz) como argumentos y hacer que funcione.fuente
Me encontré con esta pregunta / respuesta mientras buscaba cómo calcular las sumas de fila de una matriz.
Solo me gustaría agregar que la función SUMA de Matlab en realidad tiene soporte para sumar para una dimensión determinada, es decir, una matriz estándar con dos dimensiones.
Entonces, para calcular las sumas de las columnas, haga lo siguiente:
y para las sumas de fila, simplemente haz
Mi apuesta es que esto es más rápido que programar un bucle for y convertir a celdas :)
Todo esto se puede encontrar en la ayuda de matlab para SUM.
fuente
si conoce la longitud de sus filas, puede hacer algo como esto:
fuente