Aplicación de operandos y funciones

Al aplicar un operador o una función, estos pueden operar de dos manera:

Matricialmente
operan sobre la matriz como un todo, según está definido por alguna operación o función matemática. Las dimensiones de los operandos y del resultado están establecidas por la definición matemática.
Elemento-a-elemento
operan sobre cada uno de los elementos de las matrices intervinientes de manera independiente. Las matrices se utilizan simplemente como un contenedor de datos.  Si se opera la matriz X con la Y, el elemento X(i,j) se opera con el elemento Y(i,j) y el resultado de esa operación será el elemento (i,j) de la matriz resultado. Por ello, las matrices operadas han de tener las mismas dimensiones que, a su vez, serán las dimensiones de la matriz resultado.

Ejemplos

El ejemplo más claro para ver la diferencia entre esos modos de aplicación es la operación multiplicación.

Definimos X=[1,2;3,4] Y=[0,2;-1,1] Z=[1,2,3;4,5,6]

  • La multiplicación matricial se indica con el símbolo asterisco (*), y se realiza multiplicando "filas por columnas". Se tiene que cumplir que el número de filas del segundo operando se igual al número de columnas del primero.  X*Y da como resultado [-2,4;-4,10]
  • La multiplicación elemento-a-elemento se indica con los símbolos puto-asterisco (.*) El resultado de X.*Y es [0,4;-3,4]
  • Mientras que X*Z devuelve [9,12,15;19,26,33] ya que las dimensiones internas son igules.
  • En cambio X.*Z devuelve un error ya que X y Z tienen dimensiones distintas.

Broadcasting

Cuando uno de los operandos es un escalar la operación se realiza entre el escalar y cada elemento del otro operando (matriz). Es decir, el escalar se expande a una matriz, de la misma dimensión que el otro operando, con todos sus elementos con el mismo valor que el escalar. Luego se hace la operación elemento-a-elemento.

A partir de la versión 3.6.0 esto también se aplica a vectores, es decir, se replica el vector en número de veces necesarias para crear una matriz de la misma dimensión que el otro operando y luego se opera. En esto casos aparecerá un mensaje de advertencia (warning)

Ejemplos

Broadcasting de escalares:

Si definimos la matriz A=[1,2,3;4,5,6;7,8,9] y x=3

  • A.*x devuelve la matriz [3,6,9;12,15,18;21,24,27]
  • A.+x devuelve la matriz [4,5,6;7,8,9;10,11,12]

Broadcasting de vectores:

  • A.*[20,30,40] devuelve [20,60,120;80,150,240;140,240,360]
  • A.+[10;20;30] devuelve [11,12,13;24,25,26;37,38,39]
  • A.*[10,20] devuelve un error
  • A.+[200;300] devuelve un error

Obra colocada bajo licencia Creative Commons Attribution Non-commercial Share Alike 3.0 License