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

if-abfrage

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2012, 21:20     Titel: if-abfrage
  Antworten mit Zitat      
hi!

Mal wieder ein Problem mit Matlab!!

Ich habe zwei Cells: S ist ein 1x15 cell, das vektoren enthält (das zimmernummern in form von zahlen) R ist ebenfalls ein 1x15 cell, das vektoren enthält (Werte, für diese zimmer).

Ich möchte jetzt diese Werte aus R zusammenzählen, in der Form
Code:
R_sum = R{1} + R{2} + R{3} + ...

Nun ist jetzt aber mein Problem, dass nicht alle Zimmernummer in jedem Vektor vorkommen, so kann es sein, dass S{1} zB. nur 120 anstatt 178 Werte hat und gewisse Zimmernummern fehlen. Diese Fehlwerte habe ich mit NaN aufgefüllt, dass alle Vektoren, die in S enthalten sind die gleiche Länge haben.

Nur wie kann ich jetzt Matlab sagen, dass es immer nur die gleichen Zimmernummern zusammenzählt?

Kann ich eine if-Schleife mit
Code:
if S{i} == S{i}
  R_sum = ...
end
 

machen?
Mir kommt vor, als würde Matlab dann Elementeweise addieren.

Ich hoffe, es ist einigermaßen verständlich beschrieben, hoff auf eure hilfe!

LG


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.09.2012, 22:48     Titel: Re: if-abfrage
  Antworten mit Zitat      
Hallo,

Ich verstehe die Frage noch nicht. Das Auffüllen mit NaNs wird mir nicht klar. Ein vereinfachtes Beispiel mit 4 Vektoren und 6 "Zimmernummern" wäre vielleicht hilfreich.

Vielleicht hilft dies:
Code:
D = cat(1, R{:});
D(isnan(D)) = 0;
Result = sum(D, 1);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 07:58     Titel:
  Antworten mit Zitat      
Hallo!

Aufgefüllt mit NaN hab ich eigentlich nur, dass alle Vektoren die in der 1x15 cell S enthalten sind, die gleiche Länge haben.

Ich schreib mal ein Beispiel:
S = [24x1 single] [28x1 single] [26x1 single] [23x1 single] ...

R = [24x1 single] [28x1 single] [26x1 single] [23x1 single] ...

bzw.
A{1} = 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394 ...
A{2} = 1387, 1386, 1390, NaN, 1391, 1392, 1393, 1395 ...
A{3} = 1387, 1388, NaN, 1390, 1394, 1392, 1396, NaN...

R{1} = 1 8 0 6 0 0 15 2 ...
R{2} = 0 0 4 12 10 0 3 ...
R{3} = 1 1 2 5 0 0 3 0 ...

Und das möchte ich jetzt addieren, jedoch nicht elementenweise (R{1}(1)+R{2}(1) + R{3}(1) ... ) sondern ich möchte, dass die Bedingung erfüllt wird, dass nur R-Werte zusammengezählt werden, bei denen auch die Zimmernummer übereinstimmt.
In diesem Beispiel würde die Zimmernummer A{1}(1) bis A{3}(1) zusammenpassen und R kann addiert werden (1+0+1). Bei A{1}(2) bis A{3}(2) dürfte nur mehr R{1}(2) und R{3}(2) addiert werden.
Matlab soll nur R-Werte der gleichen Zimmernummer addieren.

Ich hoff, dass hilft einigermaßen weiter.Danke auf jeden Fall!

LG
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.09.2012, 12:36     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
S = [24x1 single] [28x1 single] [26x1 single] [23x1 single] ...
A{1} = 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394 ...

Als Beispiel wäre valide Matlab-Syntax brauchbar. Ich kann mir das zwar nun vorstellen, aber nicht einfach per Copy&Paste in mein Command-Window kopieren, um eine Lösung auszuprobieren.

Das Beispiel habe ich nicht verstanden. Wieso gibt es für die Zimmernummer "NaN" einen dazugehörigen R-Wert? Wozu dient das Auffüllen mit NaNs, also wozu sollen die Vektoren die gelcieh Länge haben?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 13:11     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

Als Beispiel wäre valide Matlab-Syntax brauchbar.


Leider weiss ich nicht, was damit gemeint ist. Ich habe mir mal ein paar Werte von matlab ausgeben lassen und kopier die mal rein:


    R{1} =
    21
    17
    6
    3
    23
    34
    29
    17
    40
    28
    0
    42
    10
    25
    34


    R{2} =

    14
    10
    5
    1
    10
    46
    30
    33
    32
    37
    0
    51
    15
    65
    51

    R{3} =

    5
    5
    4
    3
    6
    5
    5
    5
    14
    0
    12
    1
    12
    10
    14


    S{1} =

    1025
    1027
    1030
    1031
    1032
    1034
    1035
    1036
    1037
    1038
    1040
    1042
    1045
    1051
    1052
    1053

    S{2} =

    1024
    1025
    1027
    1030
    1031
    1032
    1034
    1035
    1036
    1037
    1038
    1040
    1042
    1045
    1047
    1050

    S{1} =
    1024
    1025
    1027
    1030
    1031
    1032
    1034
    1035
    1036
    1037
    1038
    1040
    1042
    1045
    1047
    1050



Falls ich was anders machen soll, einfach sagen.

Stimmt, eigentlich bräuchte ich S nicht mit NaN auffüllen, da ich ja mit S nicht rechne Smile

Danke,
ciao michi
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.09.2012, 13:42     Titel:
  Antworten mit Zitat      
Hallo,

Ich meine etwas, was man ins Command-Window oder in ein M-File kopieren kann:
Code:

R = {[21; 17; 6], ...
        [14; 10; 5], ...
        [ 5; 5; 4};   % usw. Ich habe die Daten mal gekürzt
 


Zitat:
Stimmt, eigentlich bräuchte ich S nicht mit NaN auffüllen, da ich ja mit S nicht rechne

Gut, dann verstehe ich es besser.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 14:16     Titel:
  Antworten mit Zitat      
Ah, okay, verstehe. Dann stell ich eine 6x1 Cells noch mal online Smile

Code:


R = {[21;0; 17; 6; 0; 25], [14; 1;10;5;1;0], [5;2;0; 5; 4; 0]}

S = {[1001; 1004; 1005; 1008; 1010; 1011], [1001;1005; 1006;1007;1010;1011], [1002; 1004;1005; 10007; 1010;1012]}

 


Danke!
michi
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.09.2012, 22:22     Titel:
  Antworten mit Zitat      
Hallo,

Und nun suchst Du die Summe aller R-Werte, die zu bestimmten S-Werten gehören, oder?
Code:

R = {[21;0; 17; 6; 0; 25], [14; 1;10;5;1;0], [5;2;0; 5; 4; 0]};
S = {[1001; 1004; 1005; 1008; 1010; 1011], [1001;1005; 1006;1007;1010;1011], [1002; 1004;1005; 10007; 1010;1012]};
vR = cat(1, R{:});
vS = cat(1, S{:});
[~, ~, index] = unique(vS);
sumR = accumarray(index, vR, [], @sum);

Und wenn Du nun einwendest, dass die Dokumentation von ACCUMARRAY nicht besonders verständich ist - stimmt. Ich zumindest verstehe sie nicht. Ein Enhancement-Report an den Technischen Support wäre eine gute Idee.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2012, 12:16     Titel:
  Antworten mit Zitat      
hey,

danke, auf das wär ich nie gekommen. Ich hab jetzt nur mehr ein Problem, das ich nicht verstehe:

Wenn ich deinen Code eingebe, bekomme ich bei der Zeile folgende Fehlermeldung:

Code:

[~, ~, index] = unique(vS);
Expression or statement is incorrect--possibly unbalanced (, {, or [.
 


Aber es sind doch alle Klammern zu und in der Help-function steht des auch mit []? Wie bekomm ich diesen Fehler noch weg?

LG, michi
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.09.2012, 16:52     Titel:
  Antworten mit Zitat      
Hallo,

Die ~ zum weglassen von Outputs funktioniert nur in >= R2009b.
Code:
[dummy, dummy, index] = unique(vS);

Klappt dies?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2012, 17:19     Titel:
  Antworten mit Zitat      
hey,

ja, so funktioniert es. Jetzt habe ich aber in der nächsten Zeile einen Fehler:

??? Error using ==> accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a scalar.

Error in ==> sumR = accumarray(index, vR, [], @sum);

Hängt das auch mit der Matlab-Version zusammen?

LG, michi
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 07:25     Titel:
  Antworten mit Zitat      
Hallo nochmal!

Ich probiert jetzt schon seit Tagen, diese Fehlermeldung zu korrigieren, nur
Komm ich einfach nicht auf die richtige Losung. Um ehrlich zu sein, ich Versteh auch nicht so richtig, was dieser Befehl macht.


Kann mir von euch noch mal wer weiterhelfen?


Danke,
Michi
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 10:53     Titel:
  Antworten mit Zitat      
Hallo Michi,

Deine Zimmernummern sind maximal vierstellig? Warum nimmst Du nicht einfach einen
Vektor bei dem der Index der Zimmernummer entspricht?
Code:
R = {[21; 0; 17; 6; 0; 25], [14; 1;10;5;1;0], [5;2;0; 5; 4; 0]};
S = {[1001; 1004; 1005; 1008; 1010; 1011], [1001;1005; 1006;1007;1010;1011], [1002; 1004;1005; 1007; 1010;1012]};

allS=unique(vertcat(S{:}));
sumR=zeros(1,max(allS));
for k=1:length(S)
  sumR(S{k})=sumR(S{k})+R{k}';
end
result=[allS,sumR(allS)'];


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2012, 14:26     Titel:
  Antworten mit Zitat      
Hey,

Jetzt bekomm ich die Fehlermeldung
"Subscript indices must Eighter Be real positive integers or logicals"

In meinen Vektor mit den zimmerNummern S hab ich NaN Werte.
Kann das daran liegen?

LG
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.09.2012, 22:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ja, so funktioniert es. Jetzt habe ich aber in der nächsten Zeile einen Fehler: ??? Error using ==> accumarray ...

Wenn ich den von mir geposteten Code in R2009a oder R2011b laufen lasse, bekomme ich keinen Fehler. Ich vermute, Du benutzt andere Input-Daten. Solange ich diese nicht kenne, kann ich keinen Ratschlag geben, wie man das Problem beheben könnte. Was ist der Unterschied zwischen den Test-Daten und Deinen realen Daten?

ACCUMARRAY hat sich meines Wissen nach in der Vergangenheit nicht geändert. Aber vielleicht solltest Du trotzdem Deine Matlab-Version nennen.

Code:
sumR = accumarray(index, vR, [], @sum);

Dieser Befehl macht folgendes:
Alle Elemente aus vR, die einen gleichen Wert in index haben, werden aufsummiert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.