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

Änderung einer Teilmatrix

 

core
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2012, 14:36     Titel: Änderung einer Teilmatrix
  Antworten mit Zitat      
Hallo,

angenommen ich habe eine Matrix m, von der ich eine Teilmatrix s betrachte (z.B. alle geraden Spaltenindizes). Anschließend suche ich in dieser Teilmatrix nach Einträgen, die eine bestimmte Bedingung erfüllen und will sie in der Matrix m verändern. Wie geht das?

Beispiel:

Code:
foo = ones(3);
foo(:) = 1:9;
%1 4 7
%2 5 8
%3 6 9
sub = foo(:, [1 3]);
subIndices = find(mod(tmp,2)==0)


Das Problem ist immer, dass ich die Indizes relativ zur Teilmatrix s bekomme und dann nicht weiß, wie ich sie in m-Indizes umwandeln soll bzw. dazu müsste ich zwei verschiedene Filterungen kombinieren: (:, [1 3]) & subIndices. Ist das irgendwie möglich?
Private Nachricht senden Benutzer-Profile anzeigen


Tusor
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 02.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2012, 14:53     Titel:
  Antworten mit Zitat      
Hallo,
schau dir in der Matlab-Hilfe unter Matrix Indexing mal die Beispiele zum Logical Indexing an. Vielleicht kommst du damit weiter.
Viele Grüße
Tusor
Private Nachricht senden Benutzer-Profile anzeigen
 
core
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2012, 15:15     Titel:
  Antworten mit Zitat      
Nein, leider nicht. Klar, logical Indexing werde ich brauchen, aber das Problem ist, dass ich gleichzeitig zwei Indizierungen auf der linken Seite kombinieren müsste. Einmal

foo(:, [1 3]) = ... bzw. die Indizierung mit der ich meine Teilmatrix erzeuge und dann noch:

foo(foo==NaN) = ... bzw. die Indizierung mit der ich die Einträge der Teilmatrix verändere

Nur Indizes, die von beiden Filterungen angesprochen werden, will ich in der Matrix foo ändern.
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: 10.09.2012, 17:28     Titel: Re: Änderung einer Teilmatrix
  Antworten mit Zitat      
Hallo core,

Ja, das Problem ist mir auch immer wieder begegnet.
Code:
foo = ones(3);
foo(:) = 1:9;
index1 = [1, 3];
sub = foo(:, index1);
index2 = (mod(sub, 2)==0);
index1and2 = index1(index2);

Mir ist das Beispiel mit "mod" nicht ganz klar, aber rein technisch funktioniert das Verknüpfen der Index-Vektoren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Tusor
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 02.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2012, 19:35     Titel:
  Antworten mit Zitat      
Hallo,
bei mir funktioniert der Code von dir (Jan S) leider nicht. Ich erhalte in der letzten Zeile "Index exceeds matrix dimensions".
Vielleicht könnte man aber einfach so eine Art Bitmasken erstellen, die man dann per AND verknüpft. Mir schwebt da folgendes Beispiel aus der Matlab-Hilfe zum Thema Logical Indexing vor:
Code:
A = [1 2 3; 4 5 6; 7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9

B = logical([0 1 0; 1 0 1; 0 0 1]);
B =
     0     1     0
     1     0     1
     0     0     1

A(B)
ans =
     4
     2
     6
     9


Das könnte man noch etwas abändern:
Code:

A = [1 2 3; 4 5 6; 7 8 9]
B = logical([0 1 0; 1 0 1; 0 0 1])
C=logical([0 1 0; 0 0 0;0 0 0])
index=B & C
A(index)
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: 11.09.2012, 16:51     Titel:
  Antworten mit Zitat      
Hallo Tusor,

Ja, der Code funktioniert nicht, wie bereits angedeutet, da ich nicht verstehe, was das "mod"-Kommando eigentlich bewirken soll. In Deinem Beispiel taucht nämlich ein "tmp" auf, das nicht definiert wurde.

Ich könnte etwas lauffähiges posten, wenn Du ein laufendes Beispiel zeigst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Tusor
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 02.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2012, 17:13     Titel:
  Antworten mit Zitat      
Hallo,
ich bin nicht der Threaderöffner (core) Wink
Dein Beispiel funktioniert meiner Meinung nach aber auch ohne die mod2-Geschichte nicht. Ich habe versucht die Methode auf ein anderes Beispiel zu übertragen.
Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
core
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2012, 21:43     Titel:
  Antworten mit Zitat      
Achso sorry, tmp sollte foo heißen, hab wohl vergessen, da umzubenennen.
Im Prinzip mache ich das auch so wie von Tusor beschrieben, also logische Maske über die ganze Matrix erzeugen und damit dann rumspielen. Trotzdem sieht es nicht nach der effizientesten Methode für ein immer wiederkehrendes Problem aus Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
core
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 12:39     Titel:
  Antworten mit Zitat      
Blödsinn, richtig heißen, muss es so:

Code:
foo = ones(3);
foo(:) = 1:9;
%1 4 7
%2 5 8
%3 6 9
sub = foo(:, [1 3]);
subIndices = find(mod(sub,2)==0)


Also noch mal: Ausgangsmatrix: foo, Filterung 1: foo(:, [1 3]), Filterung 2 auf Filterung 1: find(mod...)), kann aber jede beliebige Bedingung sein.

Bisher würde ich das eben so lösen:

Code:
mask = false(size(foo));
mask(:, [1 3]) = mod(foo(:, [1 3]), 2) == 0;
foo(mask) = 123;
 


Schön ist aber was anderes und sobald man noch eine 3. Bedingung dranhängt, hat man wieder dasselbe Problem.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tusor
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 71
Anmeldedatum: 02.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2012, 13:24     Titel:
  Antworten mit Zitat      
Wenn du die Masken wirklich wie in meinem Vorschlag per AND oder OR verknüpfst, kannst du beliebige Filter kombinieren. Das ist doch ganz OK.
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.