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

Eintrag eines Vektors aufrufen, ohne diesen zu benennen

 

qualle
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 09:25     Titel: Eintrag eines Vektors aufrufen, ohne diesen zu benennen
  Antworten mit Zitat      
Hallo zusammen,

ich würde gerne einen Eintrag (oder mehrere) eines Vektors ansprechen, ohne den Vektor vorher zu benennen.
Um bspw. den dritten Eintrag des Vektors [1 2 3 4 5] anzusprechen, habe ich mir etwas in dieser Art vorgestellt, funktioniert aber leider nicht.
Code:

[1:5](3)
 


Ich bin für jede Anregung dankbar.

Gruß qualle
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 19.07.2011, 09:58     Titel:
  Antworten mit Zitat      
hallo qualle,
du kannst die Variable "ans" verwenden, die Matlab zum zwischenspeichern nutzt.
Code:

[1:5]
ans(3) % Achtung: Hier hat ans den Wert des 3. Wertes des Vektors angenommen und nichtmehr den kompletten Vektor.
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 10:09     Titel:
  Antworten mit Zitat      
Hallo Peter,

vielen Dank für deinen Vorschlag, allerdings ist das nicht das, was ich haben will. Ich versuche mal auszuholen, mit einem kleinen Minimalbsp. Ich habe eine Funktion,bspw.
Code:

f=@(x)sin(x)
 

und eine "große" Funktion, die von dieser Funktion wiederum abhängt (Achtung, mit "falschem" Befehl)
Code:

F=@(x) f(x)[1:2].* f(x)[3:4]
 

Bevor der nächste Einspruch kommt, dass man das hier auch so lösen könnte:
Code:

F=@(x) f(x(1:2)).*f(x(3:4))
 

Das geht in meinem Fall leider nicht.

Gruß
qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.07.2011, 15:21     Titel:
  Antworten mit Zitat      
qualle hat Folgendes geschrieben:

Bevor der nächste Einspruch kommt, dass man das hier auch so lösen könnte:
Code:

F=@(x) f(x(1:2)).*f(x(3:4))
 

Das geht in meinem Fall leider nicht.

Gruß
qualle

Und warum geht es nicht, bitte ab dieser Stelle etwas ausführlicher?! Gibt es eine Fehlermeldung? Wie rufst du dann die Funktion auf...
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 16:02     Titel:
  Antworten mit Zitat      
Hallo denny,

also ich habe eine Funktion, nennen wir sie F, von der ich später die Nullstellen mit Hilfe eines Newton-Verfahrens bestimmen möchte. Diese Funktion hängt von einer Variablen x (Spaltenvektor) und implizit auch von "Koeffizientenfunktionen", nennen wir sie koeff ab.
Neues Minimalbsp.:
Code:

koeff=@(x) 1/2*([x;x(length(x))]+[x(1);x]);
M_1=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),-1);
M_2=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),1);
F=@(x) repmat(koeff(x)(1:length(x)),1,length(x))*M_1(x)*x+ repmat(koeff(2:length(x)+1),1,length(x))*M_2(x)*x;
 

Der Befehl in F um den ersten bis vorletzten Eintrag, bzw. zweiten bis letzten Eintrag von koeff aufzurufen, ist leider falsch. Und genau diesen suche ich. Wink

Vertändlicher??? Ich hoffe. Auf jeden Fall Danke fürs Nachdenken.

Gruß qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 16:26     Titel:
  Antworten mit Zitat      
edit:

o es waren noch ein paar Fehler im obigen Code um 16.02h außer dem "bekannten" Fehler, die ich jetzt korrigiert habe. Entschuldigung dafür

o Wenn ich den obigen Code eingebe kommt die folgende Fehlermeldung:
Zitat:

??? Error: ()-indexing must appear last in an index expression


Danke & Gruß
qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.07.2011, 16:33     Titel:
  Antworten mit Zitat      
Hallo

das weil du Fehler noch in Definition hast,
und zwar an dieser Stelle
Code:

repmat(koeff(x)(1:length(x)),1,length(x))
 


Worauf bezieht sich 1:length(x)?
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 16:38     Titel:
  Antworten mit Zitat      
Hallo denny,

danke für deine schnelle Rückmeldung.
mit dem Ausdruck
Code:

repmat(koeff(x)(1:length(x)),1,length(x))
 

bzw.
Code:

koeff(x)(1:length(x))
 

möchte ich den ersten bis vorletzten Eintrag von koeff(x) aufrufen. Im anderen Summanden dann entsprechend den zweiten bis letzten Eintrag.

Danke & Gruß
qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.07.2011, 16:38     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe keine direkte Lösung für dein Problem.

Ich möchte darauf aufmerksam machen, dass Function Handles primär zur schnellen Definition einfacher Funktionen gedacht sind. Diese verschachtelte Geschichte ist vermutlich nicht "im Sinne des Erfinders", wie man so schön sagt.

Vorschlag also: das ganze in eine oder mehrere Funktionen auslagern und auf mehrere Zeilen aufteilen, so dass es auch noch lesbar bleibt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 16:40     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort, auch wenn sie nicht gerade aufbauend ist... Wink

Vielen Dank aber für das Einsetzen eures Hirnschmalzes.

Gruß qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.07.2011, 17:02     Titel:
  Antworten mit Zitat      
qualle hat Folgendes geschrieben:

Code:

koeff(x)(1:length(x))
 

möchte ich den ersten bis vorletzten Eintrag von koeff(x) aufrufen. Im anderen Summanden dann entsprechend den zweiten bis letzten Eintrag.

Danke & Gruß
qualle

Und hier ist schon dein erster Fehler

Es sollte so lauten:
Code:

koeff(x(1:end-1))

 



Code:

koeff=@(x) 1/2*([x;repmat(x(end),1,length(x))]+[repmat(x(1),1,length(x));x]);
M_1=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),-1);
M_2=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),1);
F=@(x) [koeff(x(1:end-1)),[0;0]]*M_1(x)*x'+ [[0;0],koeff(x(2:end))]*M_2(x)*x';
 
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 17:10     Titel:
  Antworten mit Zitat      
Hallo denny,

vielleicht habe ich mich missverständlich ausgedrückt: Ich möchte von dem Vektor "koeff", der von x abhängt und die Dimention length(x)+1 hat einmal vom ersten bis zum vorletzten, also von 1 bis length(x) laufen lassen und einmal vom zweiten bis zum letzten Eintrag, also von 2 bis length(x)+1. Diese Teileinträge sollen dann wieder mit der Länge des Vektors x übereinstimmen.

Gruß & Danke
Andrea
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.07.2011, 17:33     Titel:
  Antworten mit Zitat      
Dann hat Harald vollkommen Recht.
so eine Verschachtelung ist bei Anonymen Funktionen unmöglich.

du muss erst deine Koeffizienten berechnen, und erst dann kannst du einzeln darauf zugreifen.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.07.2011, 17:39     Titel:
  Antworten mit Zitat      
also z.B Funktion F als m-File schreiben:

Code:

koeff=@(x) 1/2*([x;x(length(x))]+[x(1);x]);
M_1=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),-1);
M_2=@(x) diag(ones(1,length(x)))-diag(ones(1,length(x)-1),1);
 


Code:

function res = fnc_F(hkoeff, hM_1, hM_2, x)
koeff =  hkoeff(x);
r =@(x)repmat(koeff(1:end-1),1,length(x))*hM_1(x)*x+ repmat(koeff(2:end),1,length(x))*hM_2(x)*x;
res=r(x);
end
 


Aufruf:

Code:

fnc_F(koeff, M_1, M_2, 10)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
qualle
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 03.07.09
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 19.07.2011, 17:39     Titel:
  Antworten mit Zitat      
Hallo denny,

dann vielen Dank für deine Zeit und Mühen.

Gruß qualle
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.