ich möchte für eine mxn-Matrix mit Texturhöhenwerten die Höhendifferenzkorrelation berechnen, indem ich alle Punkteabstände mit mittleren Höhendifferenzen kopple. Leider ist mir dies nur mit insgesamt 4 Schleifen gelungen, was meinen Code bei großen Matrizen (z.B. 512x512) sehr langsam macht.
Wer kann mir eine Idee liefern den folgenden Code vektoriell umzusetzen und auf die Schleifen zu verzichten?
% Berechnung der Lookup-Tabelle mit den Abstandswerten für die Darstellung der HDK auf der Abszisse [m, n] = size(h);
[cols, rows] = meshgrid(1:m, 1:n);
for j = 1:m
for i = 1:n
for s = 1:m
for r = 1:n
square_R = (r-i)^2 + (s-j)^2;
index_R = find(lookup_table == square_R);
G(index_R) = G(index_R) + ((h(s,r)-h(j,i))^2);
N(index_R) = N(index_R) + 1;
end end end end
Eine Vektorisierung wird nicht weiterhelfen. Für eine 512x512 Matrix werden bisher 512^4 Iterationen benötigt, das ist 6.87*10^10. Für eine vollständig vektorisierte Version müsstest Du stattdessen eine große Matrix mit den Zwischenwerten erstellen. Diese würde dann etwa 560 GB RAM benötigen.
danke für den Hinweis. Ich habe das so befürchtet.
Leider fehlt mir aktuell noch die zündende Idee für einen Alternativansatz.
Mal sehen, vielleicht hat noch jemand eine Idee.
...aus Texturhöhenwerten die Höhendifferenzkorrelation berechnen, indem ich alle Punkteabstände mit mittleren Höhendifferenzen kopple
Ich kann mir darunter nicht konkretes vorstellen. Ich verstehe weder "Texturhöhenwerten", noch "Höhendifferenzkorrelation", noch "mittlere Höhendifferenzen", noch "koppeln" in diesem Zusammenhang.
Ich weiß nur, dass der Brute-Force-Ansatz zu aufwändig ist.
dürfte relativ lange dauern. das find ist übrigens überflüssig.
Durch die vierfach-Schleife wird zudem jede Höhendifferenz doppelt gezählt.
Vermeidet man das Doppelzählen, die Index-Suche und die inneren beiden
Schleifen, indem man sie durch Matrix-Operationen ersetzt:
Code:
h=magic(16);
G=zeros(size(h));
N=G;
A=G;
[m,n]=size(h);
for j = 1:m
for i = 1:n
G(j,i)=sum(sum((h(j:end,i:end)-h(1:end-j+1,1:end-i+1)).^2))+ ... sum(sum((h(j:end,1:end-i+1)-h(1:end-j+1,i:end)).^2));
N(j,i)=2*(m-j+1)*(n-i+1);
A(j,i)=(j-1)^2+(i-1)^2;
end end
lookup_table=unique(A);
G=arrayfun(@(a)sqrt(sum(G(A==a))/sum(N(A==a))),lookup_table);
vielen Dank für Deine Hilfe. Die Berechnung ist jetzt sehr zügig und auch meine 512x512-Matrizen lassen sich nun in 45 min berechnen. Immer noch lange, aber für mich akzeptabel.
Gruß
Markus
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.