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

Zeilen UND Spalten mit best. Einträgen gleichzeitig lösche

 

MatlabEI

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 15:07     Titel: Zeilen UND Spalten mit best. Einträgen gleichzeitig lösche
  Antworten mit Zitat      
Hallo zusammen,

ich möchte gerne Zeilen und Spalten einer Matrix gleichzeitg löschen. Und dies für diejenigen Zeilen und Spalten, die einen bestimmten Wert beinhalten.

Also beispielsweise sei meine Matrix A folgendermaßen aufgebaut:

A = 1 2 3 4
5 6 7 8
9 1 2 3
4 5 6 7


übrig bleiben soll A_reduziert, in dem Spalten und Zeilen, die eine '1' enthalten gelöscht werden:

A_reduziert = 7 8
6 7

Folgendes habe ich probiert:

Code:

A = [ 1 2 3 4 ; 5 6 7 8; 9 1 2 3; 4 5 6 7];

for a=1:length(A)
    A(A(:, a) == 1, :) = [];
    A(:,A(:, a) == 1) = [];

end


Dabei wird aber dem Ablauf der for-Schleife entsprechend eine Zeile oder eine Spalte gelöscht und dies passiert nicht gleichzeitig, so dass meine reduzierte Matrix A_reduziert nicht quadratisch ist. (In diesem Fall erhalte ich eine 2x4 Matrix).

Kennt jemand eine elegante Lösung für dieses Problem?

Bin für jegliche Hilfe sehr dankbar!

Viele Grüße,
MatlabEI


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 28.11.2013, 15:28     Titel:
  Antworten mit Zitat      
Hallo,

ich mag ja so kleine Aufgaben sehr. Hier eine (hoffentlich korrekte) von sehr vielen möglichen Lösungen:

Code:
A = [ 1 2 3 4 ;
      5 6 7 8;
      9 1 2 3;
      4 5 6 7];

[Z,S] = size(A);
% finde zeilen und spalten, die weg sollen
[z_weg,s_weg] = find(A==1);

% ermittle die zeilen und spalten, die bleiben sollen
z_behalten = setdiff(1:Z,z_weg);
s_behalten = setdiff(1:S,s_weg);

% Behalte nur noch diese Zeilen und Spalten
A_reduziert = A(z_behalten,s_behalten);


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabEI

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 15:52     Titel:
  Antworten mit Zitat      
Hallo Nras,


super! Genau so etwas wollte ich Very Happy Ich hoffe du hattest es nicht ironisch gemeint, als du meintest, du magst so Aufgaben sehr Smile

Besten Dank.

Viele Grüße,
MatlabEI
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 28.11.2013, 16:09     Titel:
  Antworten mit Zitat      
Hallo,

schön, dass dir das hilft. Und keine Angst, das war schon wirklich so gemeint, sonst würd ich mich ja aus dem Forum raushalten.

Viele Grüße.
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2013, 17:18     Titel:
  Antworten mit Zitat      
oder einfach:
Code:
reshape(A(find((((any(A==1,2)+1)*(any(A==1,1)+1) == 1).*A))),size(unique(mod((find((((any(A==1,2)+1)*(any(A==1,1)+1) == 1).*A))-1),size(A,1))+1),1),size(unique(ceil(find(((any(A==1,2)+1)*(any(A==1,1)+1) == 1).*A)/size(A,1))),1))


Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2013, 12:23     Titel:
  Antworten mit Zitat      
Ich glaube ich sollte eine neue Religion gründen.

Die Religion des allwissenden Ein-Zeilers.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.11.2013, 12:46     Titel:
  Antworten mit Zitat      
Hallo

man kann auch viel einfacheren Einzeiler zaubern:

Code:


A = [ 1 2 3 4 ;
      5 6 7 8;
      9 1 2 3;
      4 5 6 7];
A_reduziert  = A(~any(A==1,2),~any(A==1,1))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 29.11.2013, 14:06     Titel:
  Antworten mit Zitat      
Sehr elegant.
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2013, 12:30     Titel:
  Antworten mit Zitat      
@denny: Perfekt Exclamation
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.