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

Aus Vektor eine Matrix machen

 

CineXclusive
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 18.11.2010, 13:20     Titel: Aus Vektor eine Matrix machen
  Antworten mit Zitat      
Hallo zusammen,
ich habe ein kleines Problem. Ich habe einen langen Vektor den ich aufteilen und spaltenweise in eine Matrix eintragen will.

Code:
%
for i=1:length(n)
    if (n(i)<(Z(1)+1) && n(i)>(Z(1)-1))
       n_(i,1)=n(i);
    elseif (n(i)<(Z(2)+1) && n(i)>(Z(2)-1))
       n_(i,2)=n(i);
 ...
 


Als ergebnis bekomme ich dann

n_=
(1 0 ....
2 0 ....
3 0 ....
0 4 ....
0 5 ....
0 6 ....)

gewünscht ist allerdings:

n_=
(1 4 ...
2 5 ...
3 6 ...)

Wäre über Eure Hilfe sehr dankbar!
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.11.2010, 13:49     Titel:
  Antworten mit Zitat      
Besser RESHAPE nehmen:

Code:

a=[1 2 3 4 5 6]
reshape(a,[3 2])
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
CineXclusive
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 18.11.2010, 14:15     Titel:
  Antworten mit Zitat      
Hi Andreas,
danke für die Hilfe. Das Problem ist nur, dass meine "Teilstücke" aus dem Vektor unterschiedlich lang sind und ich Sie eben vorher mit den Schleifen an bestimmten Stellen trenne. Also kann ich glaub ich das Reshape nicht benutzen, oder liege ich da falsch?
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 18.11.2010, 14:54     Titel:
  Antworten mit Zitat      
Hallo,

ohne die genauen Werte, bzw. Aufbau deines Vektors zu kennen, kann man nur raten. Fuer genau dein Beispiel ginge es so:

Code:

test = [1 0; 2 0; 3 0;0 4;0 5;0 6];
test(:,2) = flipud(test(:,2))
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



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

Man kann RESHAPE verwenden hängt aber, was du hier mit bestimmten Stellen meinst. Soll denn immer 3 Zeilen Matrix rauskommen?

Kannst du dein Codestück vollständig posten? Was ist Z? Wie sieht es aus? was ist n? usw.
Private Nachricht senden Benutzer-Profile anzeigen
 
CineXclusive
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 18.11.2010, 18:20     Titel:
  Antworten mit Zitat      
So, ich versuche mittlerweile mein Problem etwas anders zu lösen. Die Sollwerte S spiegeln sich in der ersten Spalte von n wieder. Ich möchte nun gerne die Anzahl der Elemente wissen, bis ein Istwert zu S(2) auftaucht.
Nur so kann ich dann zugehörige Werte aus einem zweiten und dritten Array zuordnen. Mein Ziel ist eigentlich drei Arrays zu bekommen n(S1), n(S2) und n(S3) zu bekommen.
Man ist das schon schwierig sein Problem zu schildern Embarassed

Code:
%

S = [1 5 10]
n = [1 1.1 0.9 5.1 5.05 4.95 10.02 9.96 10]'
 


Danke nochma für eure Hilfe. Sitz hier schon den ganzen Tag dran und bekanntlich kommt nach diesem Problem das nächste ;-(
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 18.11.2010, 19:09     Titel:
  Antworten mit Zitat      
Hallo,

mhhh du willst also wissen an welcher Stelle S(2) in n auftritt? Dies ist in deinem Beispiel nicht der Fall, da es in "n" keine Zahl "5" gibt. Ansonsten wurde dies z.B. so gehen:
Code:

S = [1 5 10];
n = [1 1.1 0.9 5 5.05 4.95 10.02 9.96 10]'; % hier gibt es eine Zahl "5" an der 4. Stelle
num = find(n==S(2))
 


Vielleicht hilft die ja auch der Befehl "ismember" weiter:
Code:

[tf,loc]= ismember(S,n); % loc gibt die Stellen der Uebereinstimmungen von "S" in "n" an
 



MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
CineXclusive
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 19.11.2010, 09:42     Titel:
  Antworten mit Zitat      
Hi Sco,
ja genau das ist mein Problem. Die Werte sind zwar als Soll definiert, aber eben selten exakt der Wert....
Ich habe mir das so gedacht wie im ersten Posting:
Code:

for i=1:length(n)
    if (n(i)<(S(1)+1) && n(i)>(S(1)-1))
       n_(i,1)=n(i);
    elseif (n(i)<(S(2)+1) && n(i)>(S(2)-1))
       n_(i,2)=n(i);
....
 

Die Werte kann ich dann quasi korrekt auslesen. Vielleicht kann ich dann die entsandenen Arrays wieder zählen lassen...
Aber das ist nicht so elegant...
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 19.11.2010, 12:45     Titel:
  Antworten mit Zitat      
Hallo,

geht bestimmt noch eleganter, aber um den Index des Elementes bzw. der Elemente in "n" zu finden die am nahsten an S(2) sind, koennte man z.B. dies anwenden:
Code:

num = find(min(abs(n-S(2)))==abs(n-S(2)));
 


MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
CineXclusive
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 19.11.2010, 15:09     Titel:
  Antworten mit Zitat      
Hi Sco,

hab den Code mal getestet, aber schon bei S(3) bekomme ich für num "9" statt "7".

Bin nun mittlerweile auf Funktionen ausgewichen um das Programm übersichtlicher zu gestalten.
Mit dynamischen Variablen (eval) kann ich dann mit meinem 1. Programmteil bisher alles richtig auslesen.
Nun habe ich aber (wie sollte es anders sein) Probleme der Variablenübergabe der Funktion (Mein Programm ist mittlerweile etwas größer geworden als das Beispiel)... Das werde ich aber in einem anderen Thema posten, weil es hier direkt nicht hingehört.

Hier noch für alle die ein ähnliches Problem haben meine Lösung:

Main.m
Code:

clear;
S = [1 5 10];

for i=1:length(S)
    eval(['n' num2str(i) '=durchlauf(S(i))'])
end

 



durchlauf.m
Code:

function [vec_n] = durchlauf(S)

n = [1 1.1 0.9 5 5.05 4.95 10.02 9.96 10];

for i=1:length(n)
        if (n(i)<(S(1)+1) && n(i)>(S(1)-1))
            n_(i)=n(i);
        end
end

vec_n=nonzeros(n_);
 

Als Ergebnis bekomme ich dann

n1 =

1.0000
1.1000
0.9000


n2 =

5.0000
5.0500
4.9500


n3 =

10.0200
9.9600
10.0000


Danke nochmal für die Hilfe!
Very Happy
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 19.11.2010, 15:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:

hab den Code mal getestet, aber schon bei S(3) bekomme ich für num "9" statt "7".


Das ist doch auch richtig, oder nicht? Wie suchen in dem Vektor "n" den Wert der am naechsten zu 10 ist (S(3)). Im Vektor "n" ist das 9. Element der Wert 10, also genau was wir erwarten, da es genau der selbe Wert ist. Das 7. Element ist 10.02 und somit "weiter entfernt" von 10 (S(3)).

Oder was habe ich falsch verstanden.

Ps.: Du solltest auf den Gebrauch von
Code:

nach Moeglichkeit (und die gibt es eigentlich immer) verzichten, da es zu schwer auffindbaren Fehlern fuehren kann. Siehe hierzu auch in der Forumsuche nach Posts von Jan S diesbezueglich!!!

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
CineXclusive
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 07.01.08
Wohnort: Erlangen
Version: 2007a
     Beitrag Verfasst am: 19.11.2010, 15:55     Titel:
  Antworten mit Zitat      
Hi Sco,
ne da hast Du mich leider etwas missverstanden. Mein vorgegebener Sollwert ist 5, meine Messungen sind aber nie genau 5 wie in dem Beispiel. Beim Auslesen der Werte brauche ich aber natürlich alle Messdaten die eigentlich 5 sein sollten. Demanch auch wenn mal 4,95 auftaucht....

Zu "Eval":
Jetzt mach mir mal keine Angst Rolling Eyes Sitze seit gestern vor diesem blöden Problem und bin endlich einen Schritt weiter... Embarassed Jetzt kommen ja die nächsten Probleme...
Wie mache ich das an meinem Beispiel wenn ich zwei Vektoren zurück geben will, also n1 z1, n2 z2, etc., die auch zueinandergehörige Wertepaare sind.

Bin gerade noch am Suchen im Forum bevor ich ein neues Thema aufmache,
aber wenn hier doch noch jemand schnell eine Idee hat Cool
_________________

Viele Grüße,
CineXclusive
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 19.11.2010, 16:11     Titel:
  Antworten mit Zitat      
Hallo,

na das konte ich nicht deinem Post entnehmen, sorry.
Aber dann muesstest du auch sagen, bis zu welchen Wert in "n" dem Wert S noch zugeordnet werden soll. Also soll z.B. fuer die 5 (S(2)) auch noch 4 oder erst ab 4.5 oder erst ab 4.95 der Wert mit dazugezaehlt werden? Das muesste man schon wissen. Also qusai das Intervall: 5+-0.05 z.B.

Nehmen wir ein Intervall von 0.05 an, dann ginge das so:
Code:

n(abs(n-S(2))<=0.05)
n =
    5.0000
    5.0500
    4.9500
 


Und das ist was auch du raus hasst Smile , nur ein wenig kuerzer....

MFG

Sco
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.