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

schleifenproblem

 

andi_1
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 15.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2010, 15:36     Titel: schleifenproblem
  Antworten mit Zitat      
hallo leute,

habe hier einen code, den ich gerne in eine schleife packen würde.

-----------------------------------------------------------------------------

P = (C{1,o}) % "o" soll 1-unendlich sein
. % weiterrechnen mit P
.
.
.
.
if(anzEinser >= 1),
X = M , % wenn if-bedingung erfüllt soll für jeden schleifendurchlauf
end % ein X gespeichert werden. fortlaufend in eine Tabelle

-------------------------------------------------------------------------------

kann mir jemand bei der programmierung helfen?
Gruß
Private Nachricht senden Benutzer-Profile anzeigen


yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 28.07.2010, 16:35     Titel: Re: schleifenproblem
  Antworten mit Zitat      
Moin andi_1,

der Lesbarkeit halber bitte das nächste Mal den Code mit [ code ] und [ /code ] umschließen. (die beiden Leerzeichen weglassen. Das Knöpfle oben generiert den Block am Ende Deines aktuell eingegebenen Textes, nicht an die Stelle des Cursors.

andi_1 hat Folgendes geschrieben:
Code:

P = (C{1,o}) % "o" soll 1-unendlich sein
.                   % weiterrechnen mit P
if(anzEinser >= 1),
X = M ,       % wenn if-bedingung erfüllt soll für jeden schleifendurchlauf  
end             % ein X gespeichert werden. fortlaufend in eine Tabelle
 


Wird anzEinser bei der Berechnung von P... erzeugt?

Code:

if  anzEinser >= 1
    X(end+1) = M;
end
%bzw. falls M ein Zeilenvektor
   X(end+1,:) = M;
%bzw. falls M ein Spaltenvektor
   X(:,end+1) = M;
%bzw. falls M eine Matrix:
   X(:,:,end+1) = M;
 

Diese Lösungen haben einen Geschwindigkeitsnachteil, weil X dynamisch vergrößert wird. Wenn die Menge im Vorhinein abschätzbar ist, mit X = zeros(ungefähreZeilenanzahl, ungefähreSpaltenzahl) vereinbaren. Und dann eine Laufvariable festlegen, die inkrementiert wird, wie unten:

Wie und wann wird M & anzEinser eigentlich erzeugt?
Hier nur das Beispiel für M = Skalar, Rest analog oben.
Code:

i = 1;
X = zeros(Zeilen, Spalten);
%bzw.
X = zeros(Zeilen, Spalten, ungefähreAnzahlM);
while true
    P = (C{1,o}) % "o" soll 1-unendlich sein
    .                   % weiterrechnen mit P
    if(anzEinser >= 1),
        X(i) = M ,       % wenn if-bedingung erfüllt soll für jeden schleifendurchlauf  
       i = i+1;
    end             % ein X gespeichert werden. fortlaufend in eine Tabelle

    if Schleife_soll_enden
        break;
    end
end
 


Sollte die vorher vereinbarte Größe von X nur minimal zu klein sein, dann geht das schon i.O.. Bei signifikantem Unterschied noch nachjustieren, weil jeder Zugriff über die bisherige Grenze wieder eine dynamische Vergrößerung darstellt.
Sollte X mit weniger gefüllt werden, kannst Du mit X(find(X,1,'last')) = []; die Matrix wieder stutzen.

HTH,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_1
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 15.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2010, 16:52     Titel:
  Antworten mit Zitat      
das ist der originalcode:

Code:

sw     = 1                       % schwelle (lage)
sw1    = 1                       % schwelle (höhe)
sw2    = 2                       % offset über mittl. höhe
radius = 1.5                     % radius um mittelpunkt

 
    P = (C{1,o})                % C in einzelne tabelle umwandeln
    Q = P(1:3,1:3)              % erste 3 werte (maxima) in tabelle schreiben
    Q1(:,1)=Q(:,1);             % höhen abschneiden
    Q1(:,2)=Q(:,2);
    R = pdist(Q1,'euclid');     % abstandsmatrix bestimmen aus lage
           
% 3 minima sollen lagetechnisch innerhalb einer schwelle liegen

    if (R(1,1)<sw),              % alle 3 abstände in der abstandsmatrix auf schwelle untersuchen
        Q3(1,:) = Q(1,1:3)       % wenn unterhalb der schwelle werte zwischen denen sich die abstände befinden in Q3 schreiben
        Q3(2,:) = Q(2,1:3),
    end
    if (R(1,2)<sw),
        Q3(1,:) = Q(1,1:3)
        Q3(3,:) = Q(3,1:3),
    end  
    if (R(1,3)<sw)
        Q3(2,:) = Q(2,1:3)
        Q3(3,:) = Q(3,1:3),
    end
   
    Q2(:,1)=Q3(:,3)               % Höhen aus Q3 in eigene tabelle (Q2) schreiben
    R1 = pdist(Q2,'euclid');      % abstandsmatrix aus höhen bestimmen
       
 % 3 minima die lagetechnisch innerhalb einer schwelle liegen sollen auch höhentechnisch innerhalb einer schwelle liegen  
   
     if (R1(1,1)<sw1),            % alle 3 abstände in der abstandsmatrix auf schwelle untersuchen
        Q4(1,:) = Q3(1,1:3)       % wenn unterhalb der schwelle werte zwischen denen sich die abstände befinden in Q4 schreiben
        Q4(2,:) = Q3(2,1:3),
    end
    if (R1(1,2)<sw1),
        Q4(1,:) = Q3(1,1:3)
        Q4(3,:) = Q3(3,1:3),
    end  
    if (R1(1,3)<sw1),
        Q4(2,:) = Q3(2,1:3)
        Q4(3,:) = Q3(3,1:3),      % Q4 enthält punkte, die lagetechnisch und höhentechnisch innerhalb der beiden schwellen sw und sw1 liegen
    end
   
    B = sum(Q4) ./sum(Q4~=0);     % mittel aus Q4 bestimmen. dabei zeilen in denen zwangsläufig 0 steht, ausser acht lassen

%--------------------------------------------------------------------------

abstaende=sqrt((P(:,1)-B(1)).^2+(P(:,2)-B(2)).^2);
P3=P(abstaende<radius,:)
 
P4=P3(:,3)> B(1,3)+sw2
anzEinser= sum(P4==1);

if(anzEinser >= 1),
    W = B
   
end
 


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_1
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 15.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 11:14     Titel:
  Antworten mit Zitat      
kann mir denn jemand helfen? "o" soll hochgezählt werden. wenn die funktion samt aller if-bedingungen durchlaufen wurde, soll für jedes "o" ein B in die tabelle W geschrieben werden.

für die matlab-cracks hier dürfte das doch kein problem sein...
gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_1
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 15.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 12:06     Titel:
  Antworten mit Zitat      
Hier nochmal einfacher:

Code:

 
    P = (C{1,o})                % "o" soll mittels schleife hochgezählt werden
.
.
% operationen mit P (sämtliche if-anweisungen werden durchlaufen). am ende bekomme ich ausgerechnet aus P ein B. wenn sämtliche if-anweisungen nicht erfüllt wurden,bekomme ich kein B. Dieses B soll nun fortlaufend in die tabelle W geschrieben werden. B (3x1)
.
.
    W = B
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 12:27     Titel:
  Antworten mit Zitat      
Moin andi_1,

andi_1 hat Folgendes geschrieben:
Code:

 
    P = (C{1,o})                % "o" soll mittels schleife hochgezählt werden
.
.
% operationen mit P (sämtliche if-anweisungen werden durchlaufen). am ende bekomme ich ausgerechnet aus P ein B. wenn sämtliche if-anweisungen nicht erfüllt wurden,bekomme ich kein B. Dieses B soll nun fortlaufend in die tabelle W geschrieben werden. B (3x1)
.
.
    W = B
 
 

Das ist nun eine andere Frage als ich zuerst vermutete. Hier kannst Du trivial eine Schleife um alles packen:
Code:
k = 1;
for o=1:(floor(inf('double'))-1) % ich weiß nicht, inwiefern abgerundet werden sollte, ansonsten nur -1
    P = (C{1,o});
    ...
    W(:,:,o) = B; % (würde aber immer Nullen erzeugen, wenn ein Index übersprungen wurde
    W(k:k+2,1) = B; % jetzt werden alle B untereinander geschrieben
    k = k+3;
    W(1:3,k) = B; % jetzt werden alle B nebeneinander geschrieben
    k = k+1;
end

Meinst Du so?

Grüße,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
andi_1
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 15.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2010, 13:14     Titel:
  Antworten mit Zitat      
hi yankemen,

was meinst du soll abgerundet werden? und wenn ich nicht abrunden will, wie sieht der code dann aus mit "nur -1"?

meinst du es könnte ein problem sein, wenn meine if-anweisungen durch keine else-anweisungen abgefangen sind. wenn ich den code für die einzelen o's durchlafen lassen, bekomme ich manchmal fehlermeldungen, weil eine anweisung, die auf einer nicht erfüllten if-anweisung beruht, nicht ausgeführt werden kann.

gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 13:55     Titel:
  Antworten mit Zitat      
Moin andi_1

andi_1 hat Folgendes geschrieben:
meinst du es könnte ein problem sein, wenn meine if-anweisungen durch keine else-anweisungen abgefangen sind. wenn ich den code für die einzelen o's durchlafen lassen, bekomme ich manchmal fehlermeldungen, weil eine anweisung, die auf einer nicht erfüllten if-anweisung beruht, nicht ausgeführt werden kann.


Ja, das ist definitiv ein Problem. Denn eine if-Anweisung ist abgerabeitet, wenn das zugehörige end erreicht ist. Wenn also Q4 nicht initialisiert wird, dann ist ein Lese-Zugriff auf Q4 bei
B = sum(Q4) ./sum(Q4~=0);
mit Fehlermeldung versehen.
Stattdessen vielleicht
Code:
if exist('Q4')
    B = sum(Q4) ./sum(Q4~=0);    
end


Wie ich gerade feststellte, war es eine dumme Idee, inf('double')-1 zu machen. Denn das ergibt wieder inf. Von inf kommt man nicht mehr weg. Wenn es wirklich ewig gehen soll, und Du den Index brauchst, dann verwende eher
Code:
for o=1:1.796e+308
% das ist aber verdammt lange. Und Deine Matrizen bringen wahrscheinlich Memory-Fehler.
% Besser ist da ein
o = 1;
while true
    ...
    o = o+1;
    if Ende erreicht % also hier eine Abbruchbedingung am Ende der Schleife definieren
        break;
    end
end

Gruß,
yankemen

PS: Falls Du feststellst, dass sich alle Nase lang was ändert: ich korrigiere meine Fehler mit "edit", solange Du nicht neues schreibst.
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile

Zuletzt bearbeitet von yankemen am 30.07.2010, 14:11, insgesamt einmal bearbeitet
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: 30.07.2010, 14:09     Titel:
  Antworten mit Zitat      
Hi Andi,

Zitat:
meinst du es könnte ein problem sein, wenn meine if-anweisungen durch keine else-anweisungen abgefangen sind. wenn ich den code für die einzelen o's durchlafen lassen, bekomme ich manchmal fehlermeldungen, weil eine anweisung, die auf einer nicht erfüllten if-anweisung beruht, nicht ausgeführt werden kann.


Die Erzählung der Fehlermeldung ist nicht hilfreich. Bitte poste die Orginal-Meldung und die entsprechende Zeile.

Ich selbst kann leider in Deinem Programm nicht erkennen, was Du erreichen möchtest. Eine Schleife bis Inf laufen zu lassen ist auch nicht sehr logisch - mal abgesehen davon, dass es nicht geht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 14:14     Titel:
  Antworten mit Zitat      
Moin Jan,

so wie ich seinen Code verstehe, liegt das Problem mit den if-Bedingungen darin, dass eventuell Q4 nicht erzeugt wird, aber anschließend abgefragt wird.
Ich kann Dich aber nur unterstützen, dass Leute mit Fehlermeldungen diese auch posten.

Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
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.