WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Höhendifferenzkorrelation, Schleifen beseitigen

 

MW
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.12.11
Wohnort: Stuttgart
Version: R2011b
     Beitrag Verfasst am: 16.12.2011, 10:54     Titel: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo liebes Forum,

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?

Code:
%  Berechnung der Höhendifferenzkorrelation

h = magic(16);

% 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);

% Allgemeine Abstandsmatrix berechnen
lookup_table = abs(cols-1).^2 + abs(rows-1).^2;

% Matrixelemente in Vektor transformieren, Vektoreinträge
% aufsteigend sortieren und doppelte Einträge löschen
lookup_table = unique(sort(reshape(lookup_table,1,[])));

G = zeros(1, length(lookup_table));
N = zeros(1, length(lookup_table));


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

G = sqrt(G./N);

lookup_table = (sqrt(lookup_table));

loglog(lookup_table,G,'DisplayName','lookup_table vs. G','XDataSource',...
'lookup_table','YDataSource','G');figure(gcf);
set(gca,'XLim',[min(lookup_table) max(lookup_table)], 'YLim', ...
    [min(G) max(G)], 'XGrid', 'on', 'YGrid', 'on');
title('Height difference correlation function','FontSize',17);
xlabel('lateral distance [mm]','FontSize',15);
ylabel('height difference [mm²]','FontSize',15);
 


Über Lösungen oder Ansätze zur Lösung würde ich mich sehr freuen.

Gruß
MW
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2011, 12:19     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo MW,

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.

Du benötigst also einen anderen Ansatz.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.12.11
Wohnort: Stuttgart
Version: R2011b
     Beitrag Verfasst am: 16.12.2011, 13:19     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo Jan,

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.

Gruß
MW
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2011, 13:42     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo MW,

Was fällt Google denn dazu ein?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.12.11
Wohnort: Stuttgart
Version: R2011b
     Beitrag Verfasst am: 16.12.2011, 14:26     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo Jan,

habe bisher bei Google auch nichts gefunden, was mir weiterhelfen könnte.

Gruß
MW
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.12.2011, 18:14     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo MW,

Nach welchen Stichworten suchst Du denn?

Zitat:
...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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2011, 23:54     Titel:
  Antworten mit Zitat      
Hallo MW,
nicht nur die 4 verschachtelten Schleifen, sondern auch das Suchen des Index'
Code:
index_R = find(lookup_table == square_R);

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);
 

ist das obere Beispiel bei mir um den Faktor 27 schneller.

Gruß
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
MW
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.12.11
Wohnort: Stuttgart
Version: R2011b
     Beitrag Verfasst am: 19.12.2011, 11:10     Titel: Re: Höhendifferenzkorrelation, Schleifen beseitigen
  Antworten mit Zitat      
Hallo Sirius,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.