GNU Octave método para operar en cada elemento de una matriz. ejemplo de octava" arrayfun (arra)"


En GNU Octave versión 3.4.3, estoy teniendo problemas para aplicar una función personalizada para operar en cada elemento/elemento de una matriz.

Tengo una matriz (2,3) que se parece a:

mymatrix = [1,2,3;4,5,6];

mymatrix

   1   2   3
   4   5   6

Quiero usar cada elemento de la matriz como entrada, y ejecutar una función personalizada contra ella, y hacer que la salida de la función reemplace el contenido de mymatrix elemento por elemento.

Author: Eric Leschinski, 2012-07-09

4 answers

Arrayfun funciona bien para esto:

arrayfun(@(x) 1/(1+e^(-x)), [0, 1; 2, 3])

Salida:

ans =

   0.50000   0.73106
   0.88080   0.95257

Esto básicamente ejecuta la función 1/(1+e^(-x)) en cada elemento de la matriz/vector.

 58
Author: Nikita G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-28 20:37:59

Alternativamente, puede usar los operadores de elementos como los siguientes (tenga en cuenta el prefijo de punto):

  • .+
  • .-
  • ./
  • e.^

Por ejemplo

mymatrix = 1 ./ (1 .+ e.^(-mymatrix));
 8
Author: frhack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 07:37:44

Ponga este código en el nombre de archivo llamado " myfun.m "

function [ out ] = myfun(num)
  out = num + 5;
end

Ponga este código en el nombre de archivo llamado " main.m "

arrayfun(@myfun, [1, 0, -1; 3, 4, 5] )

Salida:

ans =
   6   5   4
   8   9   10

Observe cómo se aplicó el procedimiento (add 5) a cada elemento de la matriz.

PROTIP: Por qué este código en una matriz suficientemente grande no maximizará su CPU de cuatro núcleos.

A continuación se presenta un análisis de las capacidades de arrayfun desde la perspectiva de la Vectorización hacia abajo a través del nivel bajo C. optimización multi-core y multi-thread en el metal desnudo:

Este código arrayfun está "vectorizado", y GNU Octave empaqueta este código para entregarlo al código C pre-optimizado en lugar de tener a GNU Octave gestionando su propia iteración glacial. Las operaciones realizadas de una manera vectorizada como esta arriba son entre 2 y 5 órdenes de magnitud más rápido que si pones esto en un bucle for. Código vectorizado como este suele ser bueno-suficiente para las tareas típicas, pero si la extracción de cada revolución de caballos de fuerza de la CPU hyperthreaded de 32 núcleos de QUAD-CHIP de su Alienware es de misión crítica, siga leyendo.

No cometas el error de decir que este código es "multi-threaded" o "multi-core" porque no lo es. El código C todavía está procesando este código de una manera iterativa similar a la cola primero en entrar primero en salir. La 4ta adición debe esperar la 3ra, y la 3ra debe esperar la 2da. Su CPU está girando sus pulgares mientras se produce esta iteración. Si desea que su CPU de dieciséis núcleos debajo de su escritorio maximice su uso de CPU para 100% mientras se ejecuta esta operación, entonces no hay escape: debe detener y redefinir este problema de una manera multi-threaded y multi-core orientado. Multi-thread y multi-core está más allá del alcance de esta respuesta, la forma más fácil es definir su código de octava para generar 8 archivos paralelos job1.m separados a través de job8.m que se ejecutan todos al mismo tiempo, tener todos ellos procesando 1/8 de la tarea a mano, al final esperar a que todos terminen y luego volver a unirse a la respuesta. GNU Octave Vectorización aquí NO igual Multi-roscado hacia abajo en el metal.

 7
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 15:50:35

De manera más simple, como señaló Nasser, el siguiente código de octava:

f=@(x) x+5;
A = [1, 0, -1; 3, 4, 5];
result = f(A)
result

Aplica (x + 5) a cada elemento pasado, imprime:

result =
    6    5    4
    8    9   10
 2
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-17 13:55:47