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

Cell Arrays vergleichen und ersetzen

 

Senraphil
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2014, 09:57     Titel: Cell Arrays vergleichen und ersetzen
  Antworten mit Zitat      
Hallo zusammen,

folgender sachverhalt hat sich ergeben:

Ich lese zunächst eine Excel-Datei mit xlsread ein. Dabei wird [num,txt,raw] erstellt. [raw] ist für meine spätere Frage die Zielvariable. Zunächst stelle ich in der Variable [num] verschiedene Berechungen an. Die Ausgangsvariable [num] hat zunächst 564 Zeilen und wird auf rund 200 Zeilen durch meine Berechungen reduziert. Anschließend wandle ich diese Variable auch in cell array um.

So nun zu meinem Problem: Ich möchte die eingetragenen Werte zweier bestimmter Spalten miteinander vergleichen. Variable [raw] hat 575x24 cells und Variable [num] 200x22 cells.

Nun zum Kern:
Ich möchte aus Variable [num] die Werte in der Spalte 1 mit den Werten der Variable [raw] aus Spalte 3, Zeile 3:end vergleichen. Wenn ein Wert aus Variable [num] Spalte 1 in Variable [raw] Spalte 3, Zeile 3:end vorkommt, soll die Zeile der Varaible [raw] ab Spalte 3, in der übereinstimmende Wert steht, durch die komplette Zeile des übereinstimmenden Wertes der Variable [num] ersetzt werden.

Ist das generell möglich und wenn ja wie? Ich hoffe mir kann jemand behilflich sein. Vielen Dank.

Gruß
Senraphil
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

das ist sicher möglich, allerdings verliere ich mich in der wortreichen Beschreibung des "Kerns".

Überprüfen, ob (und wo) ein Wert in einem Array enthalten ist:
Code:


Bitte die Beschreibung möglichst mit Code bzw. in MATLAB-Notation oder anhand eines konkreten Beispiels angeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2014, 11:54     Titel:
  Antworten mit Zitat      
Ok. Dann am besten ein kurzes Beispiel:
Das ist die in einen cell array gewandelte Variable [num]
Code:

[num_cell]=
0           0            0            NaN
412        499        5,11       0,511
698        892        25          2,50
882        1289      NaN       NaN
1309      1991      -14         -1,40
2471      2989      16          1,60
3245      0           0            0
3617      4484      NaN       NaN
4022      0           0            0
4485      6014      17,13     1,713
 


Die Variable [raw] sieht wie folgt aus:
Code:

[raw]=
NaN   NaN   NaN   NaN    NaN     NaN
NaN   NaN   NaN   NaN    NaN     NaN
NaN   NaN   0        0         0         NaN
NaN   NaN   412     499     5,11     0,511
NaN   NaN   499     698     NaN     NaN
NaN   NaN   698     892     25        2,50
NaN   NaN   882     1289    NaN    NaN
NaN   NaN   1289   1309   -15,70   -1,57
NaN   NaN   1309   1991   -14       -1,40
NaN   NaN   1881   1881   NaN     NaN


Nun möchte ich vergleichen, ob der Wert num_cell(1,1) der gleiche Wert ist, wie raw(3,3). Wenn ja soll Zeile 3 in [raw] ab der 3. Spalte durch die Werte der Zeile von [num_cell] ersetzt werden. In dem hier beschriebenen Beispiel würde sich nichts ändern. trotzdem brauche ich diesen Schritt.

Ich hoffe mein Problem st nun besser verständlich.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wo genau ist dabei denn das Problem?
Code:
if num_cell{1, 1} == raw{3, 3}
raw(3, 3:end) = num_cell(1,:);
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2014, 12:51     Titel:
  Antworten mit Zitat      
Problem ist, dass ich das nicht für den ganzen Datensatz hinbekomme.
Er bringt mir ständig die Fehlermeldung: "Index exceeds matrix dimension".
Ich dachte da an eine for-Schleife, um das für den ganzen Datensatz abzuprüfen:
Code:
for k=1:size(raw)
     if num_cell{k,1}==raw{k,3}
       raw(k,3:end)=num_cell(1,:);
     end
end
clearvars k


Es ist auch ein Problem, dass der Wert in num_cell(5,1) bei der Variable [raw] erst in (10,3) kommt oder gleichen. Das rafft das Programm dann nicht und macht einfach gar nichts.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.08.2014, 13:04     Titel:
  Antworten mit Zitat      
Hallo,

wenn du == verwendest, werden eben genau diese beiden auf Gleichheit getestet. Daher hatte ich dir ja ismember vorgeschlagen.

Was soll für das Beispiel denn letztlich herauskommen? Da sollte raw doch gar nicht verändert werden, oder? Hilfreich wäre ggf. ein Beispiel, in dem man Veränderungen sieht.

Eine ganz andere Frage wäre, ob dieses mühevolle Arbeiten mit den drei Outputs von xlsread in der Form überhaupt nötig ist. Eine schöne Alternative dazu ist oft das Arbeiten mit Tables (ab Release R2013b) oder, falls du mit einem früheren Release arbeitest, Dataset Arrays (aus der Statistics Toolbox).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Senraphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 16.04.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2014, 13:23     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt, wenn ich das ganze in eine Schleife packe und mit ismember abfrage, kommt zwar kein Fehler, aber Matlab macht auch nichts.
Mein Code:
Code:
for k=1:size(data_cell)
    if ismember(data_cell{k,1},c{k,3})
       c(k,23)=data_cell(k,21);
       c(k,24)=data_cell(k,22);
    end
end


Mit Tables zu arbeiten ist ne schöne Idee, allerdings habe ich nur die Version R2009b und die Statistic Toolbox habe ich noch nicht verwendet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.08.2014, 13:31     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
kommt zwar kein Fehler, aber Matlab macht auch nichts.

... weil du nur die k-ten Elemente vergleichst. Ich würde eher an sowas denken:

Code:
for k=1:size(data_cell)
    [found, loc] = ismember(data_cell{k,1},num2cell(c(k:end,3))) ;
    if found
       c(loc,23)=data_cell(loc,21);
       c(loc,24)=data_cell(loc,22);
    end
end

(bitte möglichst durchgängig dieselben Variablennamen verwenden)

Zitat:
allerdings habe ich nur die Version R2009b

Bitte diese Info in dein Profil aufnehmen, damit man das berücksichtigen kann.

Zitat:
und die Statistic Toolbox habe ich noch nicht verwendet

Wenn du die Toolbox hast und die Daten eine tabellarische Form haben, dann wäre doch jetzt ein guter Zeitpunkt, damit anzufangen ;)

Bitte noch eingehen auf:
Zitat:
Was soll für das Beispiel denn letztlich herauskommen? Da sollte raw doch gar nicht verändert werden, oder? Hilfreich wäre ggf. ein Beispiel, in dem man Veränderungen sieht.

Numerische Daten dabei möglichst mit . als Dezimaltrennzeichen, damit man leichter nach MATLAB kopieren kann.

[/quote]Grüße,
Harald
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.