Quiero vectorizar el siguiente código MATLAB. Creo que debe ser simple, pero me resulta confuso, sin embargo.Vectorizar sumas de diferentes diagonales en una matriz
r = some constant less than m or n
[m,n] = size(C);
S = zeros(m-r,n-r);
for i=1:m-r+1
for j=1:n-r+1
S(i,j) = sum(diag(C(i:i+r-1,j:j+r-1)));
end
end
El código calcula una tabla de puntuaciones, S, para un algoritmo de programación dinámica, desde otra tabla de puntuación, C.
La suma diagonal es generar puntajes para piezas individuales de los datos utilizados para generar C, para todas las piezas posibles (de tamaño r).
¡Gracias de antemano por cualquier respuesta! Lo siento si éste debería ser obvio ...
Nota
El built-in CONV2 resultó ser más rápido que convnfft, porque mi ojo (r) es bastante pequeño (5 < = r = < 20) . convnfft.m establece que r debe ser> 20 para que se manifieste cualquier beneficio.
Impresionante, gracias. Miraré CONVNFFT mañana. En el subconjunto de datos que utilizo para la prueba (aproximadamente 500 veces más pequeño que los datos reales) la función conv2 incorporada logra una reducción de 69.652 veces en el número de llamadas y 34.56 veces la disminución en el tiempo de ejecución en comparación con los bucles (23.5 vs 0,68 s). –