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 mehreren Matrizen teile rauspicken und in eine schreiben

 

sephirooo
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.03.16
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 08.03.2016, 14:27     Titel: Aus mehreren Matrizen teile rauspicken und in eine schreiben
  Antworten mit Zitat      
Hallo,
ich bin leider nicht wirklich Programmiertechnisch begabt und habe fürs Studium nun folgendes Problem:

Ich habe zwei Matrizen, die immer abwechselnd Nullen und Werte aufweisen.

In etwa so:
Code:

M1:   M2:
   0   0
   0   1
   0   2
   2   0
   3   0
   5   0
   0   6
   0   7
   0   8
   0   9
   7   0
   8   0
   0   12
   0   13
 


Bis auf das in der ersten Zeile bei beiden eine 0 steht, unterscheiden sie sich sonst. Also damit meine ich, wenn bei dem einen eine Null steht, steht bei dem anderen ein Wert und umgekehrt.

Nun möchte ich aus den zwei Matrizen eine große machen, die immer zwei Blöcke (links + rechts) mit Werten zusammenfügt und dann in eine neue Spalte geht. Also in etwa soll das mit dem Beispiel so aussehen:

Code:

M3:
   1   6   12
   2   7   13
   2   8
   3   9
   5   7
       8

 



Den Rest würde ich halt mit Nullern auffüllen.
Geht das überhaupt? Ich weis im vornherein noch nicht einmal wie groß die Matrix am Ende überhaupt werden soll, es sich um Messwerte handelt. Es kann auch gerne in irgendeiner anderen Form gespeichert werden (bsp. Excel oder so), hauptsache ich bekomme soetwas wie eine Tabelle.


Wäre supi, wenn mir da jemand irgendwie weiterhelfen könnte.

Grüße Sephirooo
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: 08.03.2016, 15:38     Titel:
  Antworten mit Zitat      
Hallo,

mir ist zwar klar welche Werte aus M1 und M2 verwendet werden (~= 0), aber ich verstehe nicht wie die Reihenanzahl in M3 (5,6,2) zustande kommt.

Das wäre gut für eine Hilfe zu wissen.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
sephirooo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.03.16
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 08.03.2016, 15:52     Titel:
  Antworten mit Zitat      
Hallo,
vielen Dank das du dich mit meinem Problem beschäftigst.
Also ich meinte damit, dass in M1 und M2 die Nuller sozusagen weg fallen und nur alles > 0 verwendet wird. Da es immer einige Nuller gibt und dann wieder einiges > 0 sieht das ja aus wie Blöcke.
Ich brauche immer einen Block mit Werten von links und dann den anderen von rechts in M3 in einer Spalte.

Ich habe das ganze nochmal farbig gestaltet, so das es etwas klarer wird.

Danke und Gruß Sephirooo

prob.png
 Beschreibung:

Download
 Dateiname:  prob.png
 Dateigröße:  5.29 KB
 Heruntergeladen:  289 mal
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: 08.03.2016, 22:19     Titel:
  Antworten mit Zitat      
Hallo,

vermutlich ist diese Lösung etwas umständlich, funktioniert aber bei dem gezeigten Zahlenbsp. für M1 und M2.

Code:

clear
M1 = [0 0 0 2 3 5 0 0 0 0 7 8 0 0];
M2 = [0 1 2 0 0 0 6 7 8 9 0 0 12 13];
   
if length(M1) == length(M2)
    % preallocate M3
    M3 = zeros(length(M1) , length(M1(M1(:)>0)) + length(M2(M2(:)>0)));    
    changeCol = 0;
    row = 1;
    col = 1;
    % finde ersten Wert in M1/2 > 0
    idx1 = find(M1 > 0,1,'first');
    idx2 = find(M2 > 0,1,'first');
    if idx1 < idx2
        Mname = 'M1';
    else
        Mname = 'M2';
    end

    for i=1:length(M1)
        if M1(i) > 0
            if strcmp(Mname,'M2')
                % Schritt i-1: Wert aus M2 verwendet
                changeCol = changeCol + 1;
            end
           
            if changeCol == 2
                % in neue Spalte von M3 schreiben
                col = col + 1;
                changeCol = 0;
                % reset Reihe
                row = 1;
            end
           
            M3(row,col) = M1(i);          
            Mname = 'M1';
            row = row + 1;
           
        elseif M2(i) > 0
            if strcmp(Mname,'M1')
                % Schritt i-1: Wert aus M1 verwendet
                changeCol = changeCol + 1;
            end
           
            if changeCol == 2
                % in neue Spalte von M3 schreiben
                col = col + 1;
                changeCol = 0;
                % reset Reihe
                row = 1;
            end
           
            % M2 < 0
            M3(row,col) = M2(i);
            Mname = 'M2';
            row = row + 1;
           
        end        
    end
else
    disp('M1 und M2 haben nicht die gleich Anzahl an Werten')
end

% lösche alle Reihen deren Elemente Null sind
M3( ~any(M3,2), : ) = [];
% lösche alle Spalten deren Elemente Null sind
M3( :, ~any(M3,1) ) = [];
 


Evtl. kann ja einer der Matlabprofies noch Tipps für Optimierungen geben.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.03.2016, 02:57     Titel:
  Antworten mit Zitat      
Code:
M(:,1)=[0 0 0 2 3 5 0 0 0 0 7 8 0 0];
M(:,2) = [0 1 2 0 0 0 6 7 8 9 0 0 12 13];
if find(M(:,1)~=0,1)<find(M(:,2)~=0,1)
    idx=find(diff(M(:,1)~=0)==1);
else
    idx=find(diff(M(:,2)~=0)==1);
end
idx=[idx;size(M,1)];
didx=diff(idx);
M2=zeros(max(diff(idx)),numel(idx)-1);
for k=1:numel(idx)-1
    M2(1:didx(k),k)=sum(M(idx(k)+1:idx(k+1),:),2);
end

vielleicht auch so
bin mir grade nicht sicher aber für das beispiel komt schonmal das richtige raus.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
sephirooo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.03.16
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 09.03.2016, 12:08     Titel:
  Antworten mit Zitat      
Vielen vielen Dank euch beiden, dass ihr euch die Mühe gemacht habt!

Habe eben beide Versionen für mich angepasst und ausprobiert. Funktioniert beides perfekt!

Ich muss aber gestehen, dass die lange Version von DSP für mich doch etwas verständlicher ist Embarassed
Liegt wohl an meiner fehlenden Programmiererfahrung.

Toll das es Menschen wie euch gibt, die armen Studenten so das Leben retten Very Happy Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.03.2016, 13:02     Titel:
  Antworten mit Zitat      
Code:
find(M(:,1)~=0,1)<find(M(:,2)~=0,1)
die if bedingung bei mir findet raus bei welcher matrix als erstes werte größer als 0 auftreten.
Zitat:
idx=find(diff(M(:,2)~=0)==1);

gibt den index aus bei dem ein wechsel von 0 auf etwas anderes auftritt.
Code:
idx=[idx;size(M,1)];

am ende wird noch die länge angehängt damit das ende des vektors bekannt ist.
Code:
M2=zeros(max(diff(idx)),numel(idx)-1);

erstellung der 0 matrix mit der maximalen block länge die sich aus der different der anfangs indexe ergiebt.
Code:
for k=1:numel(idx)-1
    M2(1:didx(k),k)=sum(M(idx(k)+1:idx(k+1),:),2);
end

schreiben der blöcke in die matrix.
wenn du alles schritt für schritt durchgehst nicht ganz so kompliziert.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
sephirooo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 08.03.16
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 09.03.2016, 14:13     Titel:
  Antworten mit Zitat      
Danke Winkow für die genaue Beschreibung.
Stimmt, wenn man das so Zeile für Zeile durchgeht, ist es wirklich nicht sooo schwer.

Ich merke schon, ich muss noch sehr sehr viel üben Very Happy
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.