2017-01-13 8 views
1

Ich habe eine rankingMat, die die Rankings von Equity-Ticker enthält, wobei jede Spalte einen Ticker darstellt und jede Zeile einen Zeitpunkt darstellt. Das Ranking wurde in einer absteigenden Weise durchgeführt, d. H. Eine 1 in rankingMat identifiziert den höchsten Rang für diesen Zeitraum (gelesen: Zeile). Ticker/Spalte 4 stellt eine Barsicherheit dar. Dies wird später wichtig sein.Logische Indizierung mit zwei Bedingungen

Jetzt möchte ich identifizieren, in welche Aktien Ticker ich investieren soll. Es gibt zwei Bedingungen:

  1. Ich investiere nur in Tickern, die einen Rang kleiner oder gleich 3
  2. Außerdem habe ich investieren nur in Tickern, die höher oder gleich im Vergleich zu Bargeld (Ticker/Spalte Platz 4).

Ich bin in der Lage, ein Ergebnis zu erhalten, die die erste Bedingung erfüllt:

rankingMat = ... 
    [NaN, NaN, NaN, NaN, NaN, NaN; ... 
    1, 5, 2, 3, 6, 4; ... 
    4, 5, 2, 3, 6, 1; ... 
    4, 1, 2, 5, 6, 3; ... 
    6, 4, 5, 2, 1, 3; ... 
    2, 3, 4, 6, 1, 5; ... 
    3, 6, 4, 1, 2, 5; ... 
    2, 5, 6, 1, 4, 3]; 

portfolio = rankingMat <= 3; 

Das Ergebnis sieht wie folgt aus:

portfolio = ... 
    [0, 0, 0, 0, 0, 0; ... 
    1, 0, 1, 1, 0, 0; ... 
    0, 0, 1, 1, 0, 1; ... 
    0, 1, 1, 0, 0, 1; ... 
    0, 0, 0, 1, 1, 1; ... 
    1, 1, 0, 0, 1, 0; ... 
    1, 0, 0, 1, 1, 0; ... 
    1, 0, 0, 1, 0, 1] 

Mein Problem ist Bedingung 2. Jede Zeile, ich muss nicht nur vergleichen, wenn die ganze Zahl kleiner oder gleich 3 ist, muss ich auch sicherstellen, dass es weniger als die ganze Zahl in Spalte 4 in dieser bestimmten Zeile ist. Ich suche nach einer Lösung, die eine For-Schleife vermeidet. Ich denke, es ist mit Indexierung möglich. Also, jeder Hinweis wird sehr geschätzt.

Das Endergebnis sollte wie folgt aussehen:

portfolio = ... 
    [0, 0, 0, 0, 0, 0; ... 
    1, 0, 1, 1, 0, 0; ... 
    0, 0, 1, 1, 0, 1; ... 
    0, 1, 1, 0, 0, 1; ... 
    0, 0, 0, 1, 1, 0; ... 
    1, 1, 0, 0, 1, 0; ... 
    0, 0, 0, 1, 0, 0; ... 
    0, 0, 0, 1, 0, 0] 

Antwort

1
% Prior to R2016b 
portfolio = rankingMat <= 3 & ... 
      bsxfun(@lt, rankingMat, rankingMat(:,4)); 

% On or after R2016b 
portfolio = rankingMat <= 3 & ... 
      rankingMat < rankingMat(:,4); 
+1

... Dies ist eine ziemlich saubere Lösung, vor allem für die 2016b-Version. Es sieht ziemlich intuitiv aus. Eine Frage in Bezug auf bsxfun, ist diese Funktion mit einer Schleife, das heißt, aus der Perspektive der Ausführungsgeschwindigkeit, ist die Verwendung von bsxfun vergleichbar, um das Problem zu lösen mit einer for-Schleife? – Andi

+0

'bsxfun' ist eine eingebaute Funktion. Intern macht es natürlich eine "Schleife", aber die MathWorks haben wirklich ihr Bestes gegeben, um es so schnell wie möglich zu machen. Es ist Multithread, was bedeutet, dass es die Vergleiche auf mehreren Kernen gleichzeitig auswerten wird, während eine einfache Schleife in MATLAB immer nur einen Kern verwenden würde. –

+0

In R2016b haben sie es endgültig zugunsten einer Implementierung auf Sprachenebene losgeworden. [Hier] (https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/) ist ein bisschen mehr Hintergrund. –

Verwandte Themen