【问题标题】:Logical indexing with two conditions具有两个条件的逻辑索引
【发布时间】:2017-01-13 09:47:46
【问题描述】:

我有一个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 循环的解决方案。我想索引是可能的。因此,非常感谢任何提示。

最终的结果应该是这样的:

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]

【问题讨论】:

    标签: matlab indexing


    【解决方案1】:
    % Prior to R2016b
    portfolio = rankingMat <= 3 & ...
                bsxfun(@lt, rankingMat, rankingMat(:,4));
    
    % On or after R2016b
    portfolio = rankingMat <= 3 & ...
                rankingMat <  rankingMat(:,4);
    

    【讨论】:

    • ...这是一个相当巧妙的解决方案,尤其是对于 2016b 版本。它看起来很直观。关于bsxfun的一个问题,这个函数是不是使用了循环,也就是说,从执行速度的角度来看,bsxfun的使用是否可以与使用for循环解决这个问题相媲美?
    • bsxfun 是一个内置函数。在内部,它当然会执行“循环”,但 MathWorks 确实尽了最大努力使其尽可能快。它是多线程的,这意味着它将同时评估多个内核上的比较,而 MATLAB 中的简单循环只会使用 1 个内核。
    • 在 R2016b 中,他们最终完全摆脱了它,转而在语言级别实现它。 Here 有点背景。
    • 虽然数学上不正确(这也是他们花了这么长时间才改变它的部分原因),但这正是 Python 和其他人多年来一直在做的事情,只是因为它非常方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2014-05-26
    • 2015-06-06
    • 2019-01-26
    相关资源
    最近更新 更多