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

Matrix separieren

 

matlabbeginner
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2011, 15:32     Titel: Matrix separieren
  Antworten mit Zitat      
Hallo Matlab Gemeinde,

ich habe eine Aufgabe, die ich nicht so recht gelöst bekomme. Und zwar habe ich eine große Matrix mit 2 Spalten und einigen 100.000 Zeilen. Die Werte in der 1. Spalte liegen zwischen 1000 und 2000. Sie steigen mit der Schrittweite 1 auf, die Anzahl ist jedoch unregelmäßig. Es gibt also z.B. 245 mal die 1000 in der ersten Spalte, zu denen in der zweiten Spalte je ein Wert zugeordnet ist. Dann schließen sich z.B. 400 mal 1001 an usw. (alles in einer großen Matrix, die ich S1 genannt habe).

Ich würde die Matrix gerne separieren, d.h. für alle Zeilen, die mit 1000 beginnen, eine einzelne Matrix. Dann die, die mit 1001 beginnen usw. Also insgesamt 1001 einzelne Matrizen erzeugen.

Mein Ansatz ist, aber ich glaube der ist uneffizient, und ich weiß, dass er nicht korrekt ist von der Syntax, der folgende:

Code:

for i=1000:2000        
     S1ersatz=S1;
     for j=1:length(S1)
         if S1ersatz(j,1)==i
         else S1ersatz(j,2)=99;
         end
     end
     S1ersatz(S1ersatz(1,:)==99,:)=[];
     (['Regenmenge_' num2str(i) '=S1ersatz']);
 end

 

D.h. für den Fall i=1000: wenn der erste Wert in jeder Zeile nicht i entspricht, soll er eine 99 notieren und am Ende alle Zeilen mit 99 drin eliminieren. Das funktioniert aber nicht. Was ist falsch?

Danke für eine Antwort!
Private Nachricht senden Benutzer-Profile anzeigen


Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2011, 16:04     Titel:
  Antworten mit Zitat      
Du willst ernsthaft 1001 Vektoren mit eigenem Namen erzeugen?
Das ist sehr umständlich, fehleranfällig und ein sehr schlechter Stil.
(das deine Syntax falsch ist, hast du ja schon selbst erkannt, falls du immernoch den Weg gehen willst, solltest du dir "eval" in der Dokumentation anschauen)

Eine bessere Lösung wären Cell Arrays (auch hier ist die Doku sehr hilfreich)

Wenn ich es richtig verstanden habe, kommt folgendes deiner gesuchten Lösung nahe:

Code:

Regenmenge=cell(1001,1);
for i=1000:2000
   
    Regenmenge{i-999}=S1(S1(:,1)==i,:);
end
% Wenn du nun auf "Regenmenge_1532" zugreifen willst, machst du das über: Regenmenge{1532-999}

 
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.08.2011, 16:10     Titel:
  Antworten mit Zitat      
Das hier sollte wohl etwas übersichtlicher sein...

Code:

s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
m = 1;
for i=1000:2000
    % finde alle Werte in der erste Spalte von s1 == i
    index = find(s1(:,1) == i);
    % Werte == i gefunden?
    if ~isempty(index)
        % Datenstruktur mit Name und Werten
        Data(m).name = ['Regenmenge_',num2str(i)];
        Data(m).values = [s1(index,1),s1(index,2)];
        m = m + 1;
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbeginner
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2011, 16:40     Titel:
  Antworten mit Zitat      
Super, schon mal vielen Dank. Diese neue Struktur mit dem Data.name und Date.values war mir unbekannt. Das sieht jetzt zwar schön ordentlich aus, aber ich kann damit irgendwie nicht weiterrechnen! Am liebsten würde ich nämlich die nun separierten Blöcke derart zusammenfassen, dass die data.values pro data.name als Summe angegeben werden. Und dann am Ende für alle 1001 Summen diese wieder in eine Matrix geschrieben werden.
Daher war meine ursprgl. Idee mit den Vektoren, dann hätte ich über den Befehl sum was versucht. Wie komme ich aus dieser Struktur wieder zu einer Matrix mit der gewünschten Summenbildung?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.08.2011, 17:02     Titel:
  Antworten mit Zitat      
Das du die Struktur am Ende nicht benötigst, war mir nicht bewusst.
Soll die Summe jeder Spalte dann in der Matrix stehen...oder die Summe aller Elemente mit gleichem Wert aus der 1. Spalte in s1? Beim 2. hast du dann nur noch einen Vektor...
Code:

s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
m = 1;
for i=1000:2000
    % finde alle Werte in der erste Spalte von s1 == i
    index = find(s1(:,1) == i);
    % Werte == i gefunden?
    if ~isempty(index)
        % jeweils die Summe der Spalten mit i.tem Wert
        Data_sum(:,m) = sum([s1(index,1),s1(index,2)]);
        % oder Summe aller Werte der Matrix mit i.tem Wert
        % nicht erwünschte Variante löschen !!
        Data_sum(m) = sum([s1(index,1)+s1(index,2)]);
        m = m + 1;
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbeginner
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2011, 17:43     Titel:
  Antworten mit Zitat      
Vielen Dank, das ist echt spitze! Ich kann das ~isempty nicht ganz nachvollziehen,daher bin ich insgesamt noch nicht am Ziel. Wenn ich Deine Lösungen probiere, komme ich nicht auf das gewünschte Ergebnis. Es tut mir leid, wenn ich mich so doof anstelle!
Am Ende soll folgendes Ergebnis da stehen;

1000 6
1001...
2000 3

Die 6 ist die Summe aus 1, 2 und 3; die 3 ist die Summe aus 1 und 2 aus Deinem Beispiel.
Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.08.2011, 17:58     Titel:
  Antworten mit Zitat      
Das wäre dann so...

Code:

s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
 m = 1;
for i=1000:2000
     % finde alle Werte in der erste Spalte von s1 == i
     index = find(s1(:,1) == i);
     % Werte == i gefunden?
     if ~isempty(index)
         % jeweils die Summe der Spalten mit i.tem Wert
         Data_sum(m,1:2) = [s1(index(1),1),sum(s1(index,2))]);
         m = m + 1;
     end
end  
 


Das ~isempty prüft, ob Werte in index sind. In diesem Bsp für s1 sind ja nur bei i = 1000 und 2000 Werte in index. Ansonsten liefert die Funktion find: index = []
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbeginner
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 09:13     Titel:
  Antworten mit Zitat      
Super, super, super! Ganz, ganz herzlichen Dank. Jetzt funktioniert es so, wie ich es mir erträumt habe. Vielen Dank für die Geduld!!!
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.