es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Vectorización exponencial en Octave.

Estoy intentando tomar una matriz general A, elevar cada elemento a la potencia de un vector p, y sumar el resultado, preferiblemente en una operación de vector, de tal manera que el resultado sea del mismo tamaño que A. Idealmente, se deberían permitir matrices de cualquier tamaño/dimensión para A. Por ejemplo, si:

A = [0 1 ; 2 3]
p = [2 3]

Quiero el resultado A.^p(1) + A.^p(2), que es [0 2 ; 12 36], simplemente con más elegancia, y para cualquier tamaño de A y longitud de p, evitando un bucle.

Se me ocurrió lo siguiente, que expande hacia una dimensión superior de A, y luego suma a lo largo de esa dimensión:

sum(repmat(A,[ones(1,ndims(A)) length(p)]) .^ repmat(reshape(p,[ones(1,ndims(A)) length(p)]),size(A)),ndims(A)+1)

lo cual técnicamente parece funcionar, pero… ugh. ¿Existe una manera más limpia de hacer esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más limpia de lograr esta tarea usando la vectorización en Octave. Puede usar la exponenciación elemento a elemento .^ en A y p, luego aplicar la función sum a lo largo de la segunda dimensión. Aquí hay un ejemplo de implementación:

    A = [0 1 ; 2 3];
    p = [2 3];
    
    result = sum(A .^ p', 2);
    

    Explicación:

    • A .^ p' realiza una exponenciación elemento a elemento de cada elemento de A con el elemento correspondiente de p
    • Se aplica la función sum a lo largo de la segunda dimensión, que suma las filas de la matriz resultante
    • result tendrá el mismo tamaño que A, con cada elemento elevado a la potencia de cada elemento de p, y sumado.

    Esta implementación es mucho más simple y rápida que la anterior, y puede manejar matrices de cualquier tamaño y longitud de p.

Comments are closed.