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

Vektoren bzgl Norm aussieben

 

nadl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2013, 12:29     Titel: Vektoren bzgl Norm aussieben
  Antworten mit Zitat      
Hallo Matlab-Forum!

Ich habe Vektoren gegeben, welche sagen wir Spaltenweise gegeben sind.
Ich möchte nun nur Vektoren betrachten, welche über einer gewissen Vektornorm bzw. einem gewählten Schwellwert liegen.

Bisher habe ich immer einen simplen Bruteforce Algo verwendet. Nun arbeite ich auf großen Daten und da dauert dies einfach zu lang. Weiss jemand was effektiveres? Kann ich die Vektoren in der Matrix nach Norm sortieren? Dann bräuchte ich die vorderen Spalten mit Vektoren geringerer Norm einfach von der Matrix "abschneiden"

Bisheriger Algo: Sei A die Matrix mit Vektoren, IdxA die Matrix der Indexe für Vektoren, muss konsistent gelöscht werden
Code:

function [ IdxA, A ] = clean( IdxA, A , Schwellwert)
%CLEAN befreit A von Vektoren mit niedriger
%Norm und löscht diese Einträge auch in A

[n,~] = size(A);
i = 1;
while (i <= n)
    if norm(A(i,:)) < Schwellwert
        A(i,:) = [];
        IdxA(i,:) = [];
        n = n-1;
    else
    i = i+1;
    end;
end
end
 


Harald
Forum-Meister

Forum-Meister


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

ich würde das so machen:

Code:
toremove = sum(A.^2, 2) < Schwellwert^2;
A(toremove, :) = [];


Schneller wird das ganze, wenn du die Vektoren in Spalten statt in Zeilen ablegst. Dann so:
Code:
toremove = sum(A.^2) < Schwellwert^2;
A(:, toremove) = [];


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
nadl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2013, 12:41     Titel: Schwellwertbestimmung
  Antworten mit Zitat      
Danke sehr!

Leider macht das zeitlich keinen Unterschied. Dann ist es die Schwellwertfindung. Diese berechnet die Normen aller bestehenden Vektoren und bildet mean davon:

Code:

n = size(A,1);

norms = zeros([n,1]);
for i=1:n
    norms(i,1) = norm(A(i,:));
end
Schwellwert= mean(norms);

....clean(...);
 


Oder ist Schwellwertfindung einfach so aufwendig? Eigentlich muss doch alles betrachtet werden, oder?
 
Harald
Forum-Meister

Forum-Meister


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

mit dem Profiler kannst du herausfinden, welche Teile deines Codes am längsten brauchen. Und die Idee, die ich soeben verwendet habe, kannst du auch hier benutzen. Zudem werden die Normen hier wiederholt berechnet, du hast sie aber doch schon und kannst sie für die Filterung verwenden.

Grüße,
Harald
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: 13.01.2013, 23:48     Titel: Re: Schwellwertbestimmung
  Antworten mit Zitat      
Hallo nadl,

Es wäre hilfreich zu wissen, ob A 100 oder 100'000'000 Zeilen und Spalten hat.
Matlab's NORM-Befehl kann man effizienter mit einem, C-Mex-File berechnen: http://www.mathworks.com/matlabcentral/fileexchange/29035-dnorm2.

Wenn Du eine 2-Norm mit einem Schwellenwert vergleichst, wird unnötigerweise eine teure Wurzel berechnet:
Code:
x = rand(1, 3);
thresh1 = norm(x) < 0.5;    % In aufsteigender Effizienz
thresh2 = sqrt(sum(x .* x)) < 0.5;
thresh3 = sum(x .* x) < 0.5 * 0.5;  % bzw.: < 0.25
thresh4 = x * x' < 0.25;  % BLAS Call

Zur Berechnung von sum(X * X) kann man auch das DOT-Produkt verwenden, das in Matlab von der sehr effizienten BLAS-Bibliothek berechnet wird.

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.