MATLAB Verwijder alleen bepaalde nullen van Matrix

Ik heb veel antwoorden gezien over het verwijderen van voorloop- en/of volgnullen en over het verwijderen van alle nullen uit een vector of matrix. Wat ik echter wel moet doen, is slechts enkele ervan verwijderen. Ik heb twee matrices en ik wil alleen de vermeldingen verwijderen als ze allebei nul zijn. Het zijn tweedimensionale x- en y-coördinaten, opgelost met behulp van kenmerken (ik kan meer details geven indien nodig) en ik wil alleen de waarden verwijderen waarin beide matrices nullen bevatten op dezelfde indexen. Ik kan de matrices gemakkelijk omzetten in vectoren en werken met vectoren, dus alle hulp wordt in beide gevallen zeer op prijs gesteld.

1
Dat is het punt van de vraag. Ik ben dx/ds = u, dy/dx = v, dc/ds = - \ theta g (c) aan het oplossen, en ik gebruik 2D-interpolatie, zodat u u en v-waarden krijgt langs de parametrisatie, waardoor ik de volgende x krijg en y-waarden met behulp van forward Euler. Het aantal elementen in de x- en y-vector verandert echter voor elk beginpunt. Elke extra spatie die niet in een bepaalde rij is toegewezen krijgt slechts een 0-waarde. Ik wil echter c = 2 op (x, y) = (0,0), terwijl ik een aantal items zal krijgen die c (0,0) = 0 betekenen, dus ik wil de punten verwijderen waar c (0 , 0) = 0. Ik zal beide methoden hieronder proberen en zien welke het beste is. Bedankt.
toegevoegd de auteur Jeff, de bron
Hoe stel je voor om elementen uit het midden van een 2D-matrix te verwijderen?
toegevoegd de auteur Oliver Charlesworth, de bron

1 antwoord

Laten we voor de eenvoud aannemen dat u vectoren gebruikt die X en Y (van dezelfde lengte) worden genoemd en u alleen die vermeldingen wilt verwijderen waarin beide vectoren zijn nul. Hier is hoe (niet getest):

% Find the indexes where either X or Y is different from zero
% (these are the indexes of the components we want to keep)
I = find(X~=0 | Y~=0);

% Select the desired components from X and Y
X=X(I);
Y=Y(I);

Bewerken: zoals Oli hieronder heeft aangegeven (en Stefano verder uitgelegd), moet u logische indexering gebruiken voor betere prestaties.

5
toegevoegd
@MartinB - het belangrijkste voordeel is het weglaten van de functie find . Dit maakt de code vaak gemakkelijker te volgen.
toegevoegd de auteur eykanal, de bron
Bedankt voor je hulp, iedereen. Ik heb Oli gesuggereerd met logische indexering en het is fantastisch. Heel erg bedankt.
toegevoegd de auteur Jeff, de bron
Cleaner is: I = (X == 0 & Y == 0); X (I) = []; Y (I) = []; d.w.z. met behulp van logische indexering.
toegevoegd de auteur Oliver Charlesworth, de bron
@ Oli: Eerlijk nieuwsgierig - hoe is dit schoner, d.w.z. wat zijn de voordelen?
toegevoegd de auteur Martin B, de bron
@stefano: Bedankt - was hier niet van op de hoogte!
toegevoegd de auteur Martin B, de bron
@MartinB - niet alleen schoner, maar als je X typt (find (Y == iets)), raadt de matlab-editor je aan om het te repareren door de 'find'-functie te verwijderen, met het bericht: "Gebruik logische indexering om de prestaties te verbeteren in plaats van FIND "
toegevoegd de auteur stefano, de bron