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?
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
.^
enA
yp
, luego aplicar la funciónsum
a lo largo de la segunda dimensión. Aquí hay un ejemplo de implementación:Explicación:
A .^ p'
realiza una exponenciación elemento a elemento de cada elemento deA
con el elemento correspondiente dep
sum
a lo largo de la segunda dimensión, que suma las filas de la matriz resultanteresult
tendrá el mismo tamaño queA
, con cada elemento elevado a la potencia de cada elemento dep
, 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
.