具有两个条件的逻辑索引

时间:2017-01-13 09:47:46

标签: matlab indexing

我有一个rankingMat,其中包含权益代码的排名,其中每列代表一个代码,每行代表一个时间点。排名已经以降序的方式执行,即rankingMat中的1标识该时间段的最高排名(读:行)。股票代码/第4列代表现金保证金。这将是一个重要的进展。

现在,我想确定我应该投资哪些股票代码。有两个条件:

  1. 我只投资排名小于或等于3的代号。
  2. 此外,我只投资与现金相比排名更高或相等的代号(股票代码/第4栏)。
  3. 我能够得到满足第一个条件的结果:

    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循环的解决方案。我猜这可能是索引。因此,任何提示都受到高度赞赏。

    最终结果应如下所示:

    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 个答案:

答案 0 :(得分:1)

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

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