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

Spaltenweise nach gewissen Einträgen/Werten suchen/aufzähl

 

SvenMiller
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2020, 13:33     Titel: Spaltenweise nach gewissen Einträgen/Werten suchen/aufzähl
  Antworten mit Zitat      
Hallo zusammen,

ich bin neu und habe eine kurze Frage.
Ich habe eine Matlab Datei double mit 50x10 Werten.

Diese Tabelle/Datei enthält Zahlenwerte von 0 bis 3 und ich möchte immer wenn spaltenweise hintereinander die gleiche Zahl (hier 3) vorkommt diese Anzahl in einer neuen Tabelle speichern/ausgeben.

Beispielhaft anhand einer der 10 Spalten:
0 Ausgabe: 0 in neuer "Tabelle"
0 0
1 0
2 0
3 0
3 0
3 3 (da 3 mal die 3 zsmhängend vorkam)
2 0
2 0
0 0
0 0
3 0
3 2
0 0
0 0
3 1
0 0 usw.

Ich hoffe mein Anliegen ist verständlich und bitte meine Ausdrucksweise zu entschuldigen, bin neu bei Matlab.

Vielen Dank im voraus und liebe Grüße,
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.08.2020, 09:33     Titel:
  Antworten mit Zitat      
Hallo,

Code:
M = [0 0
0 0
1 0
2 0
3 0
3 0
3 3
2 0
2 0
0 0
0 0
3 0
3 2
0 0
0 0
3 1
0 0]

% Vorschlag für eine Spalte v
v = M(:,1);
out1 = M(:,2);

last3 = find(v == 3 & [v(2:end) ~= 3; true]);
out2 = zeros(size(v));
for k = 1:numel(last3)
    out2(last3(k)) = last3(k) - find(v(1:last3(k)) ~= 3, 1, 'last');
end


Dies würde ich dann nochmal in einer for-Schleife auf alle Spalten anwenden.
Ich will nicht ausschließen, dass es effizienter geht, aber bei einer Matrix dieser Größe sollte das vernachlässigbar sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2020, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

vielen vielen Dank für die Hilfe. Wenn ich Ihren Code kopiere und in Matlab laufen lasse funktioniert er einwandfrei.
Sobald ich allerdings statt M meine Ausgangsdaten eingebe erhalte ich folgenden Fehler:
"Unable to perform assignment because the left and right sides have a different number of elements."

Hilft es wenn ich die vorliegende Matlab Datei double mit 50x10 Werten so verändere, dass sie nur noch 0 und 1 enthält anstatt 0/1/2 und 3? Die Zahl 1 wird somit jedes mal geschrieben anstatt einer 3 und sonst nur 0, da ja die anderen Zahlen irrelevant sind für meine Aufzählung.


Code:
M = [0 0
1 0
1 0
1 0
0 0
1 0
1 0
1 0
0 0
0 0
1 0
0 0
0 0
0 0
0 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
0 0
0 0
1 0
1 0
0 0
0 0
1 0
1 0
0 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
1 0
0 0
0 0
1 0
1 0];

% Vorschlag für eine Spalte v
v = M(:,1);
out1 = M(:,2);

last3 = find(v == 1 & [v(2:end) ~= 1; true]);
out2 = zeros(size(v));
for k = 1:numel(last3)
    out2(last3(k)) = last3(k) - find(v(1:last3(k)) ~= 1, 1, 'last');
end



Programmgeschwindigkeit sind für mich irrelevant, wünschenswert waäre allerdings dass es auch mit anderen Tabellengrößen funktioniert (zB 15000x28).

Vielen Dank im voraus Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.08.2020, 11:48     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Sobald ich allerdings statt M meine Ausgangsdaten eingebe erhalte ich folgenden Fehler: "Unable to perform assignment because the left and right sides have a different number of elements."

Wenn ich deinen Code ausführe, läuft er fehlerfrei durch. Allerdings ist das so nicht sinnvoll, da ich davon ausging, dass M die Daten in der ersten Spalte und das Ergebnis in der zweiten Spalte enthält. Ziel war es für mich, out2 so zu konstruieren, dass es mit out1 übereinstimmt.

Wie gesagt solltest du bei einer Datenmatrix mit mehreren Spalten eine for-Schleife über diese Spalten schreiben.

Zitat:
Hilft es wenn ich die vorliegende Matlab Datei double mit 50x10 Werten so verändere, dass sie nur noch 0 und 1 enthält anstatt 0/1/2 und 3? Die Zahl 1 wird somit jedes mal geschrieben anstatt einer 3 und sonst nur 0, da ja die anderen Zahlen irrelevant sind für meine Aufzählung.

Das ist vollkommen egal.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2020, 11:48     Titel:
  Antworten mit Zitat      
Die Tabelle mit 0 und 1 funktioniert leider auch nur wenn ich es mit dem Code von Ihnen eingebe.. leider nimmt er meine Ausgangstabelle wieder nicht an, selbiger Fehler: "Unable to perform assignment because the left and right sides have a different number of elements."
Sowohl M als auch meine Tabelle ist vom Typ Double.
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2020, 11:52     Titel:
  Antworten mit Zitat      
"Wenn ich deinen Code ausführe, läuft er fehlerfrei durch. Allerdings ist das so nicht sinnvoll, da ich davon ausging, dass M die Daten in der ersten Spalte und das Ergebnis in der zweiten Spalte enthält. Ziel war es für mich, out2 so zu konstruieren, dass es mit out1 übereinstimmt.
Wie gesagt solltest du bei einer Datenmatrix mit mehreren Spalten eine for-Schleife über diese Spalten schreiben."

Vielen Dank, ich wollte es bevor ich die Schleife implementiere erstmal ohne Schleife anhand einer einzelnen Spalte testen. Die auszugebenden Zählwerte sollen idealerweise in einer neuen Tabelle ausgegeben werden, nicht in M.

Vielen Dank im voraus und viele Grüße,
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2020, 12:06     Titel:
  Antworten mit Zitat      
Folgender Code geht eben nicht:

Code:


Ausgangstabelle=
[1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   1
0   0
0   0
0   0
0   0
0   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
0   1
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   0
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1   1
1    1
1   1
1   1
1   1
1    1
1   1];



Test(1:200,1:2)=Ausgangstabelle(1:200,1:2);  % beides Typ Double

% Vorschlag für eine Spalte v
v = Test(:,1);
out1 = Test(:,2);

last3 = find(v == 1 & [v(2:end) ~= 1; true]);
out2 = zeros(size(v));
for k = 1:numel(last3)
    out2(last3(k)) = last3(k) - find(v(1:last3(k)) ~= 1, 1, 'last');
end


Unable to perform assignment because the left and right sides have a different number of elements.
Gibt er als Fehler aus...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.08.2020, 12:24     Titel:
  Antworten mit Zitat      
Hallo,

ja, bei diesem Datenbeispiel geht der Code nicht. Abhilfe:
Code:
out2 = zeros(size(v));
for k = 1:numel(last3)
    lastNot3 = find(v(1:last3(k)) ~= 1, 1, 'last');
    if isempty(lastNot3)
        lastNot3 = 0;
    end
    out2(last3(k)) = last3(k) - lastNot3;
end


Ich hatte nicht berücksichtigt, dass die Daten ja auch mit einem 3er- bzw. 1er-Block beginnen können.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2020, 15:54     Titel:
  Antworten mit Zitat      
Spitze, vielen vielen Dank für die sehr gute Hilfe.
Hat mit dem Code inkl Schleife geklappt:

Code:
v = Test(:,:);
%out1 = Test(:,2);

SDauer = zeros(size(v));                                

for b1 = [ 1:1:5 ]    
   
last3 = find(v(:,b1) == 1 & [v(2:end,b1) ~= 1; true]);

        for k = 1:numel(last3)
            lastNot3 = find(v(1:last3(k),b1) ~= 1, 1, 'last');
            if isempty(lastNot3)
                lastNot3 = 0;
            end
            SDauer(last3(k),b1) = last3(k) - lastNot3;
        end

end
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.08.2020, 14:21     Titel: Re: Spaltenweise nach gewissen Einträgen/Werten suchen/aufz
  Antworten mit Zitat      
Hallo SvenMiller,

Es wäre praktisch, wenn du die Inputs gleich so postest, dass man sie per Copy&Paste in Code verwenden kann.

Mit https://www.mathworks.com/matlabcen.....eexchange/41813-runlength:

Code:
M = [
0
0
0
1
2
3
3
3
2
2
0
0
3
3
0
0
3
0];

[B, N, BI] = RunLength(M == 3);
M(BI(B) + N(B) - 1, 2) = N(B);

Gruß, Jan

Zuletzt bearbeitet von Jan S am 17.08.2020, 16:38, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
SvenMiller
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 01.07.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2020, 10:19     Titel:
  Antworten mit Zitat      
Vielen Dank für den Hinweis, versuche ich zukünftig.
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 - 2024 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.