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

An Matrix etwas anhängen

 

Chris_toph
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 10.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2013, 14:46     Titel: An Matrix etwas anhängen
  Antworten mit Zitat      
Hallo,

wenn ich an eine bestehende Matrix etwas anhängen will, wie gehe ich vor? Bzw. ich weiß schon wie ich vorgehe, bekomme aber einen Fehler! Wink

Error using vertcat
Dimensions of matrices being concatenated are not consistent.

- Matrix A sei rand(10,5,50), wobei die 2. Spalte nur aus 0en und 1en besteht
- Matrix B sei 2spaltig mit 5 Werten pro Spalte

Spalte 2 der Matrix A besteht aus 0 oder eins.

Jetzt möchte ich bei 0 die Werte der Spalte 1 von Matrix B HINTEN an die jeweilige Zeile von Matrix A anfügen (mittels transpose (') kriege ich die Spalte als Zeilenvektor, soweit klar)

ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU

Aber irgendwie krieg ich das nicht gebacken?

Forschleife mit 1-50, abfragen mittels IF ob Wert 0 oder 1 sei und jeweils befüllen (IF + ELSE). Die Theorie ist mir klar, nur mit der Matlabausführung haperts leider. Sad

HELP! Crying or Very sad Wink
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 09.07.2013, 15:03     Titel: Re: An Matrix etwas anhängen
  Antworten mit Zitat      
Chris_toph hat Folgendes geschrieben:
- Matrix A sei rand(10,5,50), wobei die 2. Spalte nur aus 0en und 1en besteht
- Matrix B sei 2spaltig mit 5 Werten pro Spalte

Spalte 2 der Matrix A besteht aus 0 oder eins.

Jetzt möchte ich bei 0 die Werte der Spalte 1 von Matrix B HINTEN an die jeweilige Zeile anfügen

ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU
ALT ALT ALT ALT NEU NEU NEU NEU


Quellcode wäre schön gewesen, aber ich vermute, der Fehler wird entstehen, weil du versucht, unterschiedlich lange Zeilen innerhalb der Matrix zu erzeugen.

Allerdings werde ich aus dem, was du oben beschrieben hast, nicht ganz schlau.
Du möchtest Spalte 2 von A durchgehen. Sobald eine 0 dort steht, möchtest du:
- die Werte B(:,1) an A anhängen (das steht nicht expliziet da)?
- B(:,1) soll also ein Zeilenvektor werden und an A(x,end+1) angehangen werden?
Wenn B aber fünf Werte pro Spalte hat und A fünf Werte pro Zeile, was sagt mir dann die obige "Matrix" mit den ALT und NEU Einträgen?


Sinnvoll wäre es, die Matrix A gleich vorher zu vergrößern auf A(10,10,50), und diese neuen Zeilen mit NaN oder 0 (je nach Wunsch) vorzubelegen.
Code:
A(:,6:10,:) = NaN

Denn auch wenn ein Eintrag von A(x,2) keine 0 enthält müssen Elemente in dieser Zeile in der MAtrix A vorhanden sein.
Dann läßt du deine Schleife drüber laufen.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris_toph
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 10.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2013, 15:09     Titel:
  Antworten mit Zitat      
Hallo Martina,

danke für Deine Antwort.

Zitat:
Allerdings werde ich aus dem, was du oben beschrieben hast, nicht ganz schlau.
Du möchtest Spalte 2 von A durchgehen. Sobald eine 0 dort steht, möchtest du:
- die Werte B(:,1) an A anhängen (das steht nicht expliziet da)?


Ja genau!

Zitat:
- B(:,1) soll also ein Zeilenvektor werden und an A(x,end+1) angehangen werden?
Wenn B aber fünf Werte pro Spalte hat und A fünf Werte pro Zeile, was sagt mir dann die obige "Matrix" mit den ALT und NEU Einträgen?


Die ist nicht genau, ich wollte nur anzeigen wohin die Werte kommen sollen.

Ich bastle gerade. Wink Wenns nicht hinhaut, frage ich nochmal!

Danke Chris
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris_toph
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 10.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2013, 15:18     Titel:
  Antworten mit Zitat      
Es funktioniert leider trotzdem nicht...

Code:
A = rand(10,5,50);
B = rand (6,2);

A(:,6:11,:) = NaN;

for i = 1 : 50
   if A(i,2) == 0  
        A = [A(i,:); B(:,1)'];
   else
        A = [A(i,:); B(:,2)'];
   end
end


Ich weiß schon dass da jetzt keine Zahlen von 0 oder 1 drinstehen in A, aber ich kann keine MAT Files hier reinschmeissen.

Irgendwie haut es trotzdem nicht hin, und er speichert mir glaube ich auch nur den letzten Durchlauf (einmal lief es durch, wie ich es umgebaut hatte)

Der Clou ist es ist theoretisch total einfach. Sitz schon 1h um diesen %&()%)=$ reinzuprogrammieren... Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 09.07.2013, 15:42     Titel:
  Antworten mit Zitat      
Chris_toph hat Folgendes geschrieben:
Es funktioniert leider trotzdem nicht...

Code:
A = rand(10,5,50);
B = rand (6,2);

A(:,6:11,:) = NaN;

for i = 1 : 50
   if A(i,2) == 0  
        A = [A(i,:); B(:,1)'];
   else
        A = [A(i,:); B(:,2)'];
   end
end


Ich weiß schon dass da jetzt keine Zahlen von 0 oder 1 drinstehen in A, aber ich kann keine MAT Files hier reinschmeissen.

das erzeugt dir in in A eine zweite Spalte, die nur aus 0 oder 1 besteht.
Code:
A(:,2,:) = randi([0,1],10,1,50);


Du greifst definitiv falsch auf A zu.
Die Laufvariable i (bitte nicht i nutzen, denn damit überschreibst du das komplexe i, benne es um in iA oder sowas) geht nur bis 10 -denn du willst damit dort auf die Zeilen zugreifen!
Du musst, wenn du mit Schleifen arbeitest meiner meinung nach zwei schleifen nutzen:
Code:

1. Schleife über die Teilmatritzen A(:,:,1:50)
2. Schleife über jede Zeile der Teilmatrix A(1:10,:,:)
 



Code:
A = [A(iA1,:,iA3), B(:,2)'];%Komma! kein Symikolon!

Du nutzt dort ein Semikolon, welches bewirkt, dass du an A eine neue Zeile anhängst. Was nicht geht, da B nur 6 Elemente hat, A aber 10!

Außerdem vermischst du gerade deinen und meinen Ansatz:
Ich hatte die Matrix vorher vergrößert (vordefiniert) und mit NaN belegt. Denn es stand nicht da, was passiert, wenn der Wert nicht 0 ist.
Du aber schreibst entweder die 1. oder die 2. Spalte von B in A. Und hängst es an die Zeile an!
Code:

%entweder, ohne vergrößern von A mit NaN
 A = [A(iA1,:,iA3); B(:,1)'];
%oder mit vergrößern mit NaN
 A(iA1,6:11,iA3) = B(:,1)'
 

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))

Zuletzt bearbeitet von Mmmartina am 09.07.2013, 15:45, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Chris_toph
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 10.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2013, 15:44     Titel:
  Antworten mit Zitat      
Habs gelöst! Cool

Code:
for i = 1 : 60
   if A(i,2) == 0  
        A(i,6:12) = B(:,1)';
   else
        A(i,6:12) = B(:,2)';
   end
end


@Martina: Vielen lieben Dank für die Hilfe! Selten dass sich jemand derart viel Mühe macht! Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 09.07.2013, 15:56     Titel:
  Antworten mit Zitat      
Chris_toph hat Folgendes geschrieben:
Habs gelöst! Cool

for i = 1 : 60
if A(i,2) == 0
A(i,6:12) = B(:,1)';
else
A(i,6:12) = B(:,2)';
end
end

@Martina: Vielen lieben Dank für die Hilfe! Selten dass sich jemand derart viel Mühe macht! Embarassed

Wenn es mit
Code:
for i = 1 : 60
if A(i,2) == 0  

funktioniert, sieht dein A aber anders aus, als rand(10,5,50).

Aber schön, dass es funktioniert. Dennoch: nutze nicht i als Laufvariable.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 09.07.2013, 17:18     Titel:
  Antworten mit Zitat      
Hallo Chris_toph,

Alternative:
Code:
match = (A(:, 2) == 0);
A(:, 6:12) = B(:, match + 1)';

Gruß, Jan
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.