Ich möchte den folgenden MATLAB-Code vektorisieren. Ich denke, es muss einfach sein, aber ich finde es trotzdem verwirrend.Vektorisieren von Summen verschiedener Diagonalen in einer Matrix
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
Der Code berechnet eine Tabelle von Partituren, S, für einen dynamischen Programmier-Algorithmus, von einer anderen Auswertungstabelle, C.
Die Diagonalsummierung dient zur Erzeugung von Werten für einzelne Teile der Daten, die zur Erzeugung von C für alle möglichen Stücke (der Größe r) verwendet werden.
Vielen Dank im Voraus für alle Antworten! Sorry, wenn dies eine offensichtliche ...
Hinweis
Der eingebaute in CONV2 als convnfft erwies sich als schneller sein sollte, weil mein Auge (r) ist recht klein (5 < = r < = 20) . convnfft.m gibt an, dass r> 20 sein sollte, damit sich ein Vorteil manifestieren kann.
Super, danke. Ich werde morgen auf CONVNFFT schauen. Auf der Teilmenge der Daten, die ich zum Testen verwende (etwa 500 mal kleiner als echte Daten), erreicht die eingebaute conv2-Funktion eine 69,652-fache Reduktion der Anzahl der Aufrufe und 34,56-fache Verringerung der Ausführungszeit im Vergleich zu den Schleifen (23,5 vs 0,68 s). –