2016-06-20 21 views
0

IdeaVerwendung logische Operation auf sortiertes Array (halten sortierten Array nach logischer Operation)

I haben das folgende Problem. Um meine Code-Geschwindigkeit zu erhöhen, versuche ich den Großteil meines Skripts als logische Operation anstatt als for-Schleifen oder ähnliches zu schreiben.

Problem

Ich habe ein sortiertes Array und ich möchte es behalten sortiert, wie ich es als Eingabe für die nächste Funktion sortiert müssen. Um dies zu tun, habe ich den folgenden Code:

target_level=sortrows(target_level,-9); 
for i= 1:length(target_level); 
    ii=find(BML(:,1)==target_level(i,1)); 
    targets(1,i)=ii; 
end 

Deshalb möchte ich für jedes Element von "target_level(:,1)", den Index der Matrix BML zu finden, während die Sortierung zu halten. Um die for-Schleife und schreibt dies als eine logische Operation zu verlieren ich versuchte:

targets=ismember(BML(:,1),target_level(:,1)); 
targets=find(targets(:,1)==1); 

Es kommt mit dem gleichen Ergebnis nach oben, ist das einzige Problem, dass ich die Sortierung verlieren, die mich auf einer Variable angewandt, I möchte nicht wirklich behalten.

Frage

Gibt es eine Möglichkeit, die Sortierung zu halten, während logische Operationen verwendet?

+0

Sie sollten die 'length' Funktion vermeiden, die' size' und ' Numerische Funktionen machen dasselbe, sind aber weit weniger riskant. – Ratbert

+0

In welcher Weise riskant? Ich benutze sie ziemlich viel, wäre gut zu wissen, was das Risiko ist :) – KiW

+0

'Länge' gibt die Anzahl der Elemente in der größten Richtung aus. Wenn Sie also die Größe Ihres Arrays ändern, kann sich 'length' auf die Größe der ersten oder zweiten Dimension beziehen, und eine solche Variabilität in Ihren Schleifen ist im Allgemeinen nicht erwünscht. – Ratbert

Antwort

1

Um die Indizes zu erhalten, während die Sie halten das Sortieren einfach die zweite Ausgabe von ismember verwenden:

[~, targets] = ismember(BML(:,1),target_level(:,1)); 

Best,

+0

Danke für Ihre Antwort. Um zu dem Ergebnis zu kommen, wollte ich, dass Sie BML und target_level in Ihrer Antwort zu '[~, targets] = ismember (target_level (:, 1), BML (:, 1))) ändern müssen;' aber es hat große Hilfe geleistet. Vielen Dank! – KiW