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

Fehlermeldung: Assignment has more non-singleton rhs....

 

Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2013, 16:40     Titel: Fehlermeldung: Assignment has more non-singleton rhs....
  Antworten mit Zitat      
Hi, kann mir einer von euch folgende Fehlermeldung erläutern?

Zitat:
Assignment has more non-singleton rhs dimensions than non-singleton
subscripts


Ich hab schon danach gegoogelt, aber finde keine schlüssige Erklärung dieser Meldung. Vielleicht noch kurz zum HIntergrund meiner Berechung:

Ich habe drei Schleifen a,b,c in deren eine Berechnung durchgeführt werden soll. Die Anzahl der Ergebniszeilen ist dabei gleich b.

Code:

for a = 1:na
   for b = 1:nb
      for c = 1:nc
         Ergebnis(:,c,b,a) = Berechnung_Länge_Ergebnis_abhängig_von_b
      end
   end
end


Sind jetzt na, nb und nc bspw. alle =2, sollte ich vier Ergebnismatritzenfolgender Dimension bekommen:

Erg(1,2,1,1)
Erg(2,2,2,1)
Erg(1,2,1,2)
Erg(2,2,2,2)

Vor der zweiten Ergebnismatrix kommt bei mir aber oben erwähnte Fehlermeldung....

Viele Grüße


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.02.2013, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Anzahl der Ergebniszeilen ist dabei gleich b.

Wenn die Anzahl der Zeilen variiert, kann das nicht in einer 4D-Matrix angeordnet werden. Die Matrix muss ja "rechteckig" bzw. "quaderförmig" bleiben.

Zitat:
Sind jetzt na, nb und nc bspw. alle =2, sollte ich vier Ergebnismatritzenfolgender Dimension bekommen:

Ich würde es so ausdrücken: du bekommst eine 4D-Matrix, bei denen die letzten 3 Dimensionen 2 sind.

Du solltest Ergebnis auch vorbelegen, z.B. mit zeros.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2013, 17:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die schnelle Antwort! Die Vorbelegung funktioniert aber auch nur, wenn die Matrix mit Inhalt der vorbelegten Dimension gefüllt wird, oder?

Wenn ich das für b=2 mache, trägt er mir für die erste Schleife (Ergebnis hat eine Zeile) die Ergebnisse in beide Spalten (also doppelt) ein. In der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.

Soweit so gut. Sobald ich das aber für b =3 machen will, bringt er mir die Fehlermeldung: "Subscripted assignment dimension mismatch."

Liegt das daran, dass ich eine z.B. 3x4-Matrix (mit zeros vordefiniert) kein 2x4 Ergebnis schreiben kann?

Gibt es einen Trick, um die Dimension einer Matrix variabel zu halten?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.02.2013, 18:05     Titel:
  Antworten mit Zitat      
Hallo Fehlerkönig,

Zitat:
Gibt es einen Trick, um die Dimension einer Matrix variabel zu halten?

Das kommt darauf an. Wenn man immer größere Vektoren in die Zeilen einer Matrix schreibt, wächst die Zeilenlänge automatisch mit. Dazu werden in den anderen Zeilen Nullen eingefügt.
Aber natürlich lässt sich die Matrix so nicht automatisch verkleinern, weiol dabei dann ja auch wertvolle Informationen vernichtet werden könnten.

Wenn Du Arrays unterschiedlicher Größe zusammen speichern möchtest, benötigst Du ein CELL Array. Siehe "doc cell".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2013, 18:14     Titel:
  Antworten mit Zitat      
Die Matrix soll nur größer werden, nach folgender Struktur:

a(1,20,1,1)
a(2,20,2,1)
a(1,20,1,2)
a(2,20,2,2)
a(1,20,1,3)
a(2,20,2,3)
...

Nullen hat er bei mir ja keine automatisch hinzugefügt, sonst wäre die erste Fehlermeldung ja eigentlich überflüssig, oder?
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2013, 11:51     Titel:
  Antworten mit Zitat      
Zitat:
Wenn ich das für b=2 mache, trägt er mir für die erste Schleife (Ergebnis hat eine Zeile) die Ergebnisse in beide Zeilen (also doppelt) ein. In der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.

Soweit so gut. Sobald ich das aber für b =3 machen will, bringt er mir die Fehlermeldung: "Subscripted assignment dimension mismatch."


Kann mir einer bei diesem Problem helfen? Dass er das Ergebnis doppelt einträgt ist nicht so schlimm, damit könnte ich umgehen. Aber das er ab b=>3 keine Ergebnisse mehr eintragen kann ist ein Problem... :/
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.02.2013, 15:42     Titel:
  Antworten mit Zitat      
Hallo Fehlerkönig,

Da wir nur eine grobe beschreibung des Codes sehen, können wir nur schwer erraten, wo genau der Fehler liegt. Ein Verbesserungsvorschlag ist dementsprechend sachwierig.
Was genau bedeutet dies:
Zitat:
Ergebnismatritzenfolgender Dimension bekommen:

Erg(1,2,1,1)
Erg(2,2,2,1)
Erg(1,2,1,2)
Erg(2,2,2,2)

Was bedeutet hier "folgender Dimension"?

Zitat:
Wenn ich das für b=2 mache, trägt er mir für die erste Schleife (Ergebnis hat eine Zeile) die Ergebnisse in beide Zeilen (also doppelt) ein. In der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.

Diese beiden Sätze verstehe ich nicht.

Es würde helfen, wenn Du einen lauffähigen relevanten Abschnitt aus Deinem Code postest.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2013, 19:31     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für dein Interesse! Ich kann leider keinen lauffähigen Ausschnitt aus meinem Code schicken, da dieser auf zu vielen Eingangsdaten und div. Toolboxen basiert.

Aber ich hab das Problem mal vereinfacht runtergeschrieben. Es sollte so übereinstimmen Wink

Code:

clear all

na = 3
nb = 2
nc = 24
Ergebnis = zeros(nb,nc,nb,na);
for a = 1:na
    for b = 1:nb
        for c = 1:nc
            Ergebnis(:,c,b,a) = ones(b,1)*b;
        end
    end
end
 


Wenn du das so laufen lässt, sind die beiden Sätze hoffentlich verständlicher:

Zitat:
Wenn ich das für b=2 mache, trägt er mir für die erste Schleife (Ergebnis hat eine Zeile) die Ergebnisse in beide Zeilen (also doppelt) ein. In der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.


Es muss übrigens nb=2 heißen, sorry. Was ich meinte, ist, dass er die 1er auch in die zweite Zeile einträgt, obwohl der Befehl ones(b,1)*b lautet und daher die zweite Zeile 0 sein sollte. Das liegt aber bestimmt an Ergebnis(:,c,b,a) = ones(b,1)*b; und ist eigentlich auch nicht weiter schlimm.

Zitat:
n der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.

Im zweiten Durchgang der Schleife (b=2) trägt er das Ergebnis der Rechnung nun in Zeile 1 und 2 ein. In meiner ursprünglichen Berechnung sind dies unterschiedliche Ergebnisse, hier nun immer 2er.

Soweit so gut. Wenn jetzt aber nb=3 ist, sind wir an diesem Punkt:
Zitat:
Soweit so gut. Sobald ich das aber für b =3 machen will, bringt er mir die Fehlermeldung: "Subscripted assignment dimension mismatch."


Das ist jetzt mein Problem, dass er hier nicht nach dem bisherigen Muster weitermacht und für den dritten Schleifendurchgang die Matrix mit 3ern füllt.

Ich hoffe, das Problem ist so verständlicher geworden...
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2013, 11:48     Titel:
  Antworten mit Zitat      
keiner eine Idee, oder ist es noch unverständlich?

Grüße
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.03.2013, 12:13     Titel:
  Antworten mit Zitat      
Hallo Fehlerkönig,

Das "clear all" macht mich irgendwann noch wahnsinnig. Es bringt gar nichts alle geladenen Funktionen aus dem Speicher zu löschen. Es verschwendet nur Zeit. Aber das nur nebenbei.

Zitat:
Wenn ich das für b=2 mache, trägt er mir für die erste Schleife (Ergebnis hat eine Zeile) die Ergebnisse in beide Zeilen (also doppelt) ein. In der zweiten Schleife trägt er dann die beiden unterschiedlichen Ergebnisse in Zeile 1 und 2.

Was bedeutet "Ergebnis hat eine Zeile"? Was ist die "zweite Schleife"? Was genau ist eine "Zeile" bei einem 4D Array?

Zitat:
Was ich meinte, ist, dass er die 1er auch in die zweite Zeile einträgt, obwohl der Befehl ones(b,1)*b lautet und daher die zweite Zeile 0 sein sollte.

Das verstehe ich nicht.

Zitat:
Soweit so gut. Sobald ich das aber für b =3 machen will, bringt er mir die Fehlermeldung: "Subscripted assignment dimension mismatch."

Bitte poste eine Kopie der Fehlermeldung, vor allem auch, in welcher Zeile der fehler erscheint. Betrifft die Meldung den gezeigten vereinfachten Code?

In dem gezeigten Code würde man natürlich einfach das "ones(b,1)" weglassen, aber vermutlich soll dies demonstrieren, dass Du einen Vektor in das 4D-Array kopieren möchtest.
Dies kann aber nur funktionieren, wenn die entsprechenden Dimensionen gleich groß sind.
Code:
Ergebnis(:,c,b,a) = ones(b,1)*b;

Hier kann ein Vektor der Größe [2 x 1] nicht in das Array geschrieben werden, wenn die Größe der ersten Dimension nicht gleich 2 ist.
Vielleicht suchst Du nach:
Code:
Ergebnis(1:b, c, b, a) = ones(b,1)*b;

Aber das ist erstmal nur geraten. Dann würden die nicht-beschriebenen Elemente beim Wert 0 bleiben. Ist das so gewollt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Fehlerkönig

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2013, 17:31     Titel:
  Antworten mit Zitat      
Oh man, es lag echt daran, dass ich
Code:
Ergebnis(:,c,b,a) = ones(b,1)*b;
statt
Code:
Ergebnis(1:b, c, b, a) = ones(b,1)*b;
verwendet habe - wie du geschrieben hast... Ich dachte das Problem läge viel tiefgründiger. Aber eigentlich ja gut Wink

Genau, meine Beschreibungen bezogen sich alle auf den verkürzten und dargestellten Code.

Vielen Dank fürs Tomaten vor den Augen entfernen Wink
 
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.