www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - for schleife
for schleife < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

for schleife: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 12:48 Mi 19.09.2007
Autor: anitram

halli hallo!

ich stehe vor folgendem problem:
gegeben sind:
wert1= 1,2,3, wert2=4,5,6 , HM ist eine Matrix und K=3

eine schleife wie diese hier würde ich gerne verwenden:

for k= 1:K
    [B(k),A(k)]=find(HM(:,:,wert1(k))==wert2(k))
    imshow(I); hold on;
    plot((A(k)),(B(k)),'xr')
end

dabei sollte (denn leider funktionierts so nicht wie ich mir wünsche)
B(1)A(1)
B(2)A(2)
B(3)A(3)
ausgegebn werden und  die einzelnen Punkte(insgesamt 3) geplottet werden.

ich erhalte aber folgende fehlermeldung:
in assignment A(I)=B the number of elements of B and I must be the same.
der fehler liegt in der zeile:
[B(k),A(k)]=find(HM(:,:,wert1(k))==wert2(k))

ich sehe schon, dass HM 3-dim ist, aber [B,A] nur 2 dim. aber es geht ja um die gefundenen Punkte und die sind jeweils 2-dim.

was mache ich hier falsch?
wie könnte ich denn das ohne for-schleife umgehen??

vielen dank für jede antwort!
lg anitram

        
Bezug
for schleife: Antwort
Status: (Antwort) fertig Status 
Datum: 14:28 Mi 19.09.2007
Autor: Martin243

Hallo,

das Problem ist, dass die Werte für wert2 mehrmals, ggf. auch unterschiedlich oft in HM vorkommen. Mit [A(k),B(k)]= sagst du aber, dass du nur ein Paar von Skalaren erwartest.

Die Frage ist, ob du die Ergebnisse nur plotten willst oder auch für später brauchst.
Nehmen wir Letzteres an. Dann nehmen wir die Suchergebnisse in temporäre Variablen auf und speichern sie dann (weil die Werte ggf. unterschiedlich häufig vorkommen) in einem Cell Array:

for k = 1:K,
  [BB,AA] = find(HM(:,:,wert1(k))==wert2(k));
  imshow(I); hold on; 
  plot(AA, BB, 'xr');
  A{k}=AA;
  B{k}=BB;
end;

Stellt sich nur die Frage: Musst du das Bild I wirklich in jedem Schleifendurchlauf ausgeben? Eher nicht, oder?


Gruß
Martin

Bezug
                
Bezug
for schleife: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 09:28 Mo 24.09.2007
Autor: anitram

hallo martin!

erstmal danke für deine antwort!

hatte bis jetzt leider keine zeit das ganze auszuprobieren, mach mich aber jetzt dran!

zu deiner frage ob ich das Bild immer ausgeben will:
wollen tu ichs nicht, aber ich hätte gerne jeden dieser punkte (alle auf einmal) in einem bild eingezeichnet.
und ich dachte das geht am besten gleich in der for schleife, aber ich glaube das ist wohl zu rechenaufwendig, oder?

lg anitram

Bezug
                        
Bezug
for schleife: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 10:33 Mo 24.09.2007
Autor: anitram

habs jetzt ausprobiert und bin sehr zufrieden damit!!!
leider haperts aber immer an solchen sachen bei mir, dass ichs selber nicht hinbekomm!

wegen dem bild hab ich jetzt folgendes probiert:

imshow(I); hold on;

for k = 1:K,
  [BB,AA] = find(HM(:,:,wert1(k))==wert2(k));
  plot(AA, BB, 'xr');
  hold on;
  A{k}=AA
  B{k}=BB
  text((A{k}),(B{k}),num2str(wert1),'color','green')
end;

ich hab das ganze an einem beispiel ausprobiert, wo 2 punkte gefunden werden, die werden auch eingezeichnet!!
aber zu den punkten dazugeschrieben (im bild) wird immer der wert1 von beiden punkten, also nicht der wert1 vom jeweiligen punkt...

und die ausgabe von A{k} und B{k} gelingt auch nicht so wie ichs mir vorstell,
so wie in der for-schleife, erhalte ich
A =1
B=2

A= 1 4
B= 2 6

A = 1 4  7
B= 2 6 8
usw.

ist es auch möglich dass die Punkte so ausgeben werden:
A{1} = 1
B{1} = 2

A{2} = 4
B{2} = 6

??? oder so ähnlich?

wie kann ich denn das nun noch lösen???
gar nicht so einfach... aber wenn das jetzt auch noch klappt, dann bin ich richtig zufrieden!!!

vielen dank  nochmal! du bist echt eine große hilfe!

lg anitram



Bezug
                                
Bezug
for schleife: Antwort
Status: (Antwort) fertig Status 
Datum: 11:53 Mo 24.09.2007
Autor: Martin243

Hallo,

> aber zu den punkten dazugeschrieben (im bild) wird immer der wert1 von beiden punkten, also nicht der wert1 vom jeweiligen punkt...

Meintest du etwa
text((A{k}),(B{k}),num2str(wert1(k)),'color','green')  ???


> und die ausgabe von A{k} und B{k} gelingt auch nicht so wie ichs mir vorstell,
> so wie in der for-schleife, erhalte ich...

Hmmm, du kannst auch die einzelnen Elemente eines Cell Arrays ansprechen.
Mit A{1} holst du dir alle Fundstellen für k=1. Wenn du wert1(k) zehmal gefunden hast, dann bekommst du auch einen zehnelementigen Vektor.
Die einzelnen Vektoreinträge erhält man per:
A{1}(1)
A{1}(2)
A{1}(3)
etc.
War es das, was du meintest?


Gruß
Martin

Bezug
                                        
Bezug
for schleife: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 12:07 Mo 24.09.2007
Autor: anitram


>  Meintest du etwa
>  
> text((A{k}),(B{k}),num2str(wert1(k)),'color','green')
>  ???

ja genau, das meinte ich! dass ich darauf nicht selber komme...

>
> > und die ausgabe von A{k} und B{k} gelingt auch nicht so wie
> ichs mir vorstell,
> > so wie in der for-schleife, erhalte ich...
>  Hmmm, du kannst auch die einzelnen Elemente eines Cell
> Arrays ansprechen.
>  Mit A{1} holst du dir alle Fundstellen für
> k=1. Wenn du wert1(k) zehmal gefunden hast, dann bekommst
> du auch einen zehnelementigen Vektor.
> Die einzelnen Vektoreinträge erhält man per:
>  A{1}(1)
>  A{1}(2)
>  A{1}(3)
>  etc.
>  War es das, was du meintest?

hm, ich glaube nicht so ganz, dass ich das so meinte, muss aber erst darüber nachdenken...
so wie ich dich verstehe, muss ich nach beenden des programms
z.b. A{1}(3) eintippen um den wert zu erhalten, oder? das ist mir klar.
ich hätte aber gern, dass das nach beenden des programms "automatisch" schon dasteht, oder ist das ein bisschen viel verlangt??
also es sollte ausgegeben werden
A{1}(3) = 5
und nicht
A = 1  3 5 6 8 ...

oder meinen wir eh das gleiche?

vielen dank!!!
lg anitram

Bezug
                                                
Bezug
for schleife: Antwort
Status: (Antwort) fertig Status 
Datum: 12:21 Mo 24.09.2007
Autor: Martin243

Hallo,

> so wie ich dich verstehe, muss ich nach beenden des programms
> z.b. A{1}(3) eintippen um den wert zu erhalten, oder?

Neee, das war nur ein Beispiel. Du müsstest einfach zwei verschachtelte fro-Schleifen schreiben, die das übernehmen.

> ich hätte aber gern, dass das nach beenden des programms "automatisch" schon dasteht, oder ist das ein bisschen viel verlangt??

Nein, nicht, wenn man sich die Mühe macht, das Matlab mitzuteilen.
Wir könnten es erstmal auf die Schnelle machen:
for i=1:length(A),
  for j=1:length(A{i}),
    A{i}(j)
  end;
end;

Da sieht die Ausgabe aber potthässlich aus. Also machen wir uns an die schön formatierte Ausgabe:
for i=1:length(A),
  for j=1:length(A{i}),
    sprintf('A{%2g}(%2g) = %g', i,j,A{i}(j))
  end;
end;

Das ist schon eher das gesuchte, aber immer noch zu verstreut. Also geben wir es explizit so aus, wie es (meiner Meinung nach) aussehen soll. Dabei können wir es noch so ausrichten, dass die jeweiligen Werte untereinander stehen:
for i=1:length(A),
  for j=1:length(A{i}),
    disp(sprintf('A{%g}(%3g) = %3g', i,j,A{i}(j)));
  end;
end;

> oder meinen wir eh das gleiche?

Hmmm, sag du es mir!


Gruß
Martin

Bezug
                                                        
Bezug
for schleife: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:39 Mo 24.09.2007
Autor: anitram

hallo!!

das ist ja schon fast optimal!!! danke!!!!

das einzige was mich stört, ist, dass jetzt immer ausgegeben wird:

ans=

A{1}(2) = 4

also es steht immer noch ein ans dabei...
lässt sich das vermeiden??

vielen dank!!
lg anitram

Bezug
                                                                
Bezug
for schleife: Antwort
Status: (Antwort) fertig Status 
Datum: 16:11 Mo 24.09.2007
Autor: Martin243

Hallo,

kann es sein, dass du die ganze Berechnung in einer eigenen Datei in einer Funkion untergebracht hast?
Falls ja, dann musst du hinter den Funktionsaufruf immer ein Semikolon setzen.


Gruß
Martin

Bezug
                                                                        
Bezug
for schleife: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 10:55 Di 25.09.2007
Autor: anitram

hallo!

am semikolon liegts leider nicht...

aber das soll mich jetzt im moment nicht länger aufhalten, bin ganz zufrieden wies sonst funktioniert, und das tut es!

danke für deine hilfe!
lg anitram

Bezug
                        
Bezug
for schleife: Antwort
Status: (Antwort) fertig Status 
Datum: 11:56 Mo 24.09.2007
Autor: Martin243

Hallo,

du hast ja im folgenden Beitrag das "imshow" ganz richtig aus der Schleife genommen. Das "hold on" musst du auch nur einmal vor der Schleife aufrufen.
Du könntest auch alle AAs und BBs sammeln und er ganz am Ende ausgeben. Aber wenn du nicht superschnell sein musst, dann ist das eher egal.


Gruß
Martin

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]