¿Cuál es la sintaxis correcta para la aplicación de una función a los elementos de sub de una matriz sin utilizar un bucle?

StackOverflow https://stackoverflow.com/questions/2239022

  •  19-09-2019
  •  | 
  •  

Pregunta

Tengo un definido una función (getDepth) que hace algo bastante trivial, por ejemplo, toma en una matriz de 2x4 y da salida a una matriz de 2x1. entonces tengo una matriz de 2x4xn quiero aplicarlo a, y estoy esperando un resultado 2x1xn matriz.

¿Cuál es la sintaxis correcta para aplicar mi función para la matriz sin recurrir al uso de un bucle?

ed. Conforme a lo solicitado, he aquí un ejemplo de lo que estoy tratando de hacer:

function [bidWSize, askWSize] = getWSizes(m, bookSizeHistory)
    bidWSize = sum(bookSizeHistory(2:4, 1, m));
    askWSize = sum(bookSizeHistory(2:4, 2, m));
end

Actualmente estoy a continuación, un bucle y la alimentación en una salida 2x1xn

¿Fue útil?

Solución

Vas a tener que escribir la función de modo que pueda manejar matrices de nx2x4. Si es que hace algo trivial, que no debería ser demasiado difícil. Si tiene algún problema con eso, se puede publicar aquí y pedir ayuda.

EDIT:

suma es una función que funciona bien con matrices, por lo que puede lograr lo que quiere con sólo sumando sobre la matriz, y jugando con las dimensiones. que no es necesario en absoluto la función:

sum(bookSizeHistory(2:4, 1:2, :))

sumas sobre la primera dimensión (como lo que se hace en la función), por lo que suponiendo que el tamaño de bookSizeHistory es Kx2xN, la salida de esta suma es 1x2xN. se puede añadir un permute para reorganizar las dimensiones como que desea:

permute(sum(bookSizeHistory(2:4, 1:2, :)), [2 1 3])

debe darle lo que necesita.

Otros consejos

Puede realizar funciones en elementos individuales utilizando el "" operador. Por ejemplo, con lo que cada elemento a alguna potencia, se debería utilizar:

C=A.^B;

En lugar de:

[rows,cols]=size(A);
for i=1:rows
    for j=1:cols
        C=A(i,j)^B;
    end
end

Esto da código mucho más corto que un bucle con los mismos resultados. Por lo general se conoce como código "vectorizada", que se aprovecha de las funciones Blas. De lo contrario Matlab es más como un lenguaje interpretado, lo que es mucho más lento. Otras funciones realizan operaciones en todas las filas o columnas de una matriz. Si A fuera una matriz 2-D (2,4), suma (A) daría la suma de cada columna. Cuando la suma total podría ser encontrado algunas maneras diferentes:

A_temp=reshape(A,[1,8]);
B=sum(A_temp);

o

A=sum(sum(A));

Puede haber alguna otra funcionalidad en el comando suma que permite que esto se haga con una sola llamada con un argumento adicional, pero esto sigue siendo una forma decentemente rápido para hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top