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

For Schleife Doppeltdurchlaufen

 

Ente

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2012, 16:05     Titel: For Schleife Doppeltdurchlaufen
  Antworten mit Zitat      
Hey!
Mir ist gerade etwas sehr seltsames passiert: aus irgendeinem Grund wird mein For-schleife manchmal zweimal durchlaufen... hier das programm dazu

Code:

%n,m ungerade

[a,b] =size(A);
 for u = 1+((n-1)/2):a-((n-1)/2)
     for v = 1+((m-1)/2):b-((m-1)/2)
         
        for k = (-(n-1)/2) : ((n-1)/2)
            for l = (-(m-1)/2) : ((m-1)/2)
            w(1,s) = A(u+k,v+l);
            s = s+1;
            end
        end
%Einträge des Vektors nach ihrer Größe sortieren und dies als neuen Vektor
%w speichern
 w = sort(w);
%mittlersten Eintrag als neuen Eintrag der Matrix wählen

%Fehler: for Schleife wird manchmal doppelt ausgeführt, dadurch ist d/2
%keine ganze Zahl
d = length(w)+1;
 B(u,v) = w(1,d/2);
     end
 end
 


Die mittleren For-schleifen(k und l) werden manchmal(aber nicht immer) 2mal durchlaufen - wie kann denn das bitte vorkommen?? Und woran kann das liegen? der Vektor w wird dadurch doppelt so groß und das Programm funktioniert dann nicht weiter..

Ich bitte um Hilfe, weil das bringt mich wirklich zum verzweifeln =/


Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 03.06.2012, 17:35     Titel:
  Antworten mit Zitat      
Das ist keine Verständnisfrage sondern die eines komplexen Systems.

Meine Anregung:

Gib die Variable A mit ins Forum damit wir den Programmablauf
nachvollziehen können.


Außerdem sagt meine Erfahrung das "Verzweiflung" meistens einhergeht
mit "Zu schnell" > Also setze Breakpoints und überwache alle Variablen
Schritt für Schritt.

Eine Systemfehler den du zugegeben nicht offen aussprichts ist unwahrscheinlich. Wahrscheinlicher ist, dass die For-Schleife die die mittleren enthält zu oft durchlaufen wird (Wie unterscheiden sich die Variablen im Normal und im Fehlerfall)


Oder: Die Stelle hier: W(1,s) >> ich kenn ja den Rest dieser Variable
nicht aber falls die Dimension wo jetzt die 1 steht noch weiter geht,
dann könnte es sein das lenght(w) die Länge DIESER Dimension liefert
Falls sie nicht weiter geht ist sie übrigens überflüssig!


Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Ente

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2012, 21:04     Titel: ..
  Antworten mit Zitat      
hey,
danke für die Antwort

Hier das gesamte Programm:

Code:

function [B] = median(A,n,m)
%MEDIANFILTER Summary of this function goes here
%   A Matrix, die bearbeitet werden soll, W Gewichtsmatrix, n Filtergröße

%m,n müssen ungerade sein und der Filter darf nicht größer als A sein

if(length(A)+1) > n && length(A) >= m

w = zeros(1,n*m);
s = 1;
B = A;

[a,b] =size(A);
%Vektor w mit Einträgen der Filterregion füllen
 for u = 1+((n-1)/2):a-((n-1)/2)
     for v = 1+((m-1)/2):b-((m-1)/2)
         
        for k = (-(n-1)/2):((n-1)/2)
            for l = (-(m-1)/2):((m-1)/2)
            w(1,s) = A(u+k,v+l);
            s = s+1;
            end
        end
%Einträge des Vektors nach ihrer Größe sortieren und dies als neuen Vektor
%w speichern
 w = sort(w);
%mittlersten Eintrag als neuen Eintrag der Matrix wählen

%Fehler: for Schleife wird manchmal doppelt ausgeführt, dadurch ist d/2
%keine ganze Zahl
d = length(w)+1
 B(u,v) = w(1,d/2);
     end
 end

else
    'Filter ist zu groß'
end

end
 


A ist daher eine Matrix, die übergeben wird..

Ja ich hab das Problem schon bereits gefunden: es passiert genau in der For-Schleife k und l: sie werden doppelt durchlaufen und dadurch wird der Vektor w doppelt so lang.
Das passiert aber nicht immer, sondern für mich in keinem zu verstehnden Systm. Manchmal funktioniert es 2 u,v Schritte lang, manchmal nicht ...

Meine Testfunktion:

Code:

A = [3,3,3; 7,7,7; 4,4,4];
n = 3;
m = 3;
median(A,n,m);

B=ones(5,7,3);
B(:,:,2) = 2;
B(:,2,2) = 1;
[m,n,h]=size(B);

C = zeros(m,n);
D = zeros(m,n);
E = zeros(m,n);

%alle 3 Ebenen in 2-dim Matrizen speichern
for j=1:m
    for k=1:n
        C(j,k) = B(j,k,1);
    end
end
for j=1:m
    for k=1:n
        D(j,k) = B(j,k,2);
    end
end
for j=1:m
    for k=1:n
        E(j,k) = B(j,k,3);
    end
end

C_ = median(C,3,3);
 


Bei der ersten Testmatrix A funktioniert alles und bei C_ nicht mehr, ab der 3. Runde der u,v For-Schleife.
Es wird einfach dann zweimal l=-1:1, k=-1:1 durchlaufen.
Woran könnte das nun liegen??
 
Ente

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2012, 22:38     Titel: alles klar..
  Antworten mit Zitat      
Omg, also wirklich so dämlich... ich hab einfach die Laufvariable s nicht wieder 1 gesetzt und die eine Testmatrix durchläuft es nur einmal..
hach, tut mir leid für die blöde Frage, sowas dummes =/ =/
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.06.2012, 23:21     Titel: Re: alles klar..
  Antworten mit Zitat      
Hallo Ente,

Noch eine Anmerkung:
Zitat:
Code:
for j=1:m
    for k=1:n
        D(j,k) = B(j,k,2);
    end
end

Kann man in Matlab einfacher ausdrücken:
Code:
D(1:m, 1:n) = B(1:m, 1:n, 2);

Oder gleich:
Code:
D = B(1:m, 1:n, 2);

und die Pre-allocierung weglassen.

Die Formatierung im Forum funktioniert übrigens mit dem / Slash, nicht mit \. Ich habe das mal oben verbessert.

Gruß, Jan
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.