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-Spalten mit Schleife in neue Matrix schreiben

 

gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2013, 14:24     Titel: Matrix-Spalten mit Schleife in neue Matrix schreiben
  Antworten mit Zitat      
Hallo,

ich habe eine Matrix in der nicht nur Werte sondern auch Buchstaben und leere Zeilen vorkommen.
Ich möchte jeweils spaltenweise die Zeilen durchgehen und prüfen ob eine Zahl in dem Feld steht und wenn ja, dann soll dieses Feld in eine neue Matrix geschrieben werden. Danach soll die nächste Spalte durchgegangen werde.
Mein code bisher:
Code:

B=xlsread(Matrix.xlsx');

% Hilfsvaribblen
i01=1;
l01=length(B);
j01=1;

% Schleifendurchlauf für Spalten 1 bis 12
% "s" ist Spaltenzahl
s=1;
while( s<=12)
   
        % Schleifendurchlauf bis Zeilen-Zahl die Anzahl der Zeilen erreicht
        while( i01<=l01)
         % Hilfsvariable zur Deklaration ob NaN oder Zahl
         t01 = isnan(B(i01,s));
              % falls Zahl
             if( t01==0)
                   C(j01,s)=B(i01,s);
                  % Hilfsvariablen hochzählen
                    i01=i01+1;
                    j01=j01+1;
       
                % falls keine Zahl, dann in 11-nächste Zeile springen    
                 else
                 i01=i01+11;
             end
        end

% Hilfsvariable Spaltenzahl hochzählen
s=s+1;

end
 


Leider beschreibt er in der Matix C jeweils nur die erste Spalte und geht nicht hoch.
Wo ist mein Fehler?


gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2013, 14:28     Titel:
  Antworten mit Zitat      
Ach... und wie kann ich die Anzahl der Zeilen der Spalten abfragen.
Man könnte
Code:
Laenge01=length(B,1);
und das für alle ist das ja aufwendig wenn es viele Spalten werden.

Ich überlege mir
Code:
und das in die Schleife zu integrieren. Könnte das funktionieren?
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 10.12.2013, 14:52     Titel:
  Antworten mit Zitat      
Hallo gagnool,

wieso nutzt du nicht den gegebenen output von xlsread?
Code:
[num,txt,raw] = xlsread(filename)


Desweiteren würde ich bei einem Konstrukt eher for-Schleifen benutzen, bzw. gleich auf logische Indizierung (logical indexing) gehen.

Grüße
Chris
_________________

--> Kapieren statt Kopieren <---
____________________________________________________
FAQs sind dazu da, FAQs zu beantworten Wink
Richtig fragen!
Private Nachricht senden Benutzer-Profile anzeigen
 
gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2013, 09:59     Titel:
  Antworten mit Zitat      
Erstmal Danke für die Antwort.

Leider kenne und verstehe ich den von dir angegebenen Code nicht.
 
gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2013, 10:02     Titel:
  Antworten mit Zitat      
Aber tendenziell würdest du sagen, dass mein Code in die richtige Richtung geht wenn ich for-Schleifen verwende.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.12.2013, 13:54     Titel:
  Antworten mit Zitat      
Zitat:


Code:

[num,txt,raw] = xlsread(filename)



Wie bereits BlackDread dich hingewiesen hat, trennt XLSREAD automatisch die Ausgaben in Zahlen-(erster Ausgabeparameter) und Textwerte(zweiter Ausgabeparameter), nur in dritten Ausgabeparameter stehen die Zahlenwerte und Textwerte gemeinsam.


Zitat:
Leider beschreibt er in der Matix C jeweils nur die erste Spalte und geht nicht hoch.
Wo ist mein Fehler?

Dein Fehler liegt das du den Counter i01 und j01 nicht zurücksetzt, nach dem du die erste Spalte gefüllt hast.
Deswegen musst du an der Stelle wo du Counter s hoch zählst, die Counter für die zweite Schleife zurücksetzen.




Mit ISNAN kannst du auch auf einmal deine Matrix auf nicht Zahlwerte überprüfen
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 10:18     Titel:
  Antworten mit Zitat      
Vielen Dank
 
gagnool

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2013, 10:22     Titel:
  Antworten mit Zitat      
aber leider wird mir mit dem Befehl
Code:
auch nur die erste Zeile in der Matrix C ausgeben
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.12.2013, 12:14     Titel:
  Antworten mit Zitat      
gagnool hat Folgendes geschrieben:
aber leider wird mir mit dem Befehl
Code:
auch nur die erste Zeile in der Matrix C ausgeben


Nein, es wird alles ausgegeben, nur halt in einer Zeile.

Da muss man natürlich noch richtig anpassen, aber ich kenne deine Daten nicht, deswegen ist für mich ein Ratespiel.
Bitte anhand eines Beispiel immer noch erläutern, was man erreichen möchte.
z.B. so
Code:

% es werden nur Splaten übernommen, die keine NaNs enthalten:
B = rand(10,10);
B(2,4)= NaN;
B(3,6)= NaN
C = B(:, ~any(isnan(B),1))
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.