2017-01-13 67 views
1

我有一個rankingMat其中包含權益報價的排名,其中每列表示一個報價器,每一行代表一個時間點。排名已按降序進行,即rankingMat中的1表示該時間段的最高排名(閱讀:行)。代碼/第4欄代表現金安全。這將在未來的道路上發揮重要作用。具有兩個條件的邏輯索引

現在,我想確定我應該投資哪些股票投資者。存在兩種情況:

  1. 我只投資於有等級小於或等於3
  2. 另外行情,我只投資於那些排名高於或等於相比現款代號(股票代號/列4)。

我能得到的是滿足第一條件的結果:

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; 

結果看起來是這樣的:

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] 

我的問題是條件2。每一行,我不僅需要比較整數是否小於或等於3,還需要確保它小於該特定行中列4中的整數。我正在尋找避免for-loop的解決方案。我想這是可能的索引。所以,任何提示都非常感謝。

最後的結果應該是這樣的:

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] 

回答

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

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

...這是一個非常巧妙的解決辦法,特別是對2016B版本。它看起來非常直觀。關於bsxfun的一個問題是,這個函數使用了一個循環,也就是說,從執行速度的角度來看,bsxfun的用法相當於使用for-loop來解決這個問題嗎? – Andi

+0

'bsxfun'是一個內置函數。在內部它當然會做一個「循環」,但MathWorks真的盡其所能地儘可能快地完成它。它是多線程的,這意味着它將同時評估多個內核的比較,而MATLAB中的簡單循環只會使用1個內核。 –

+0

在R2016b中,他們最終完全擺脫它,贊成在語言層面實施它。 [這裏](https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/)稍微有點背景。 –