根据另一个矩阵的排名计算总和

时间:2017-11-21 18:54:45

标签: matlab

我有两个相对较大的矩阵(以下两个图表是示例)。第一个矩阵是五天内五个股票的排名(五列,但其中一列有缺失值)。第二个矩阵是五天内这五只股票的市值。我希望每天根据第一个矩阵中行的降序选择市值大小不超过第六列的股票。例如,在第1天,首先选择股票3,然后选择股票2.接下来是股票5,但总市值将大于第6列,因此仅选择两只股票。接下来,创建一个新矩阵,选择的股票为1,非选择股票为0.谢谢!这是排名矩阵

Days    Stock 1 Stock 2 Stock 3 Stock 4 Stock 5
Day 1         1       3       4     #N/A      2
Day 2         3       4       2        1    #N/A
Day 3         4       3      #N/A      1      1
Day 4        #N/A     1       2        3      4
Day 5        #N/A     3       2        1      4

以下是市值矩阵:

Days    Stock 1 Stock 2 Stock 3 Stock 4 Stock 5 Column 6
Day 1         20      30      30      #N/A    55    67.50
Day 2         25      35      35      43     #N/A   69.00
Day 3         89      88     #N/A     34     100    155.50
Day 4         #N/A    33      82      99      11    112.50
Day 5         #N/A    33      22      44      33    66.00

1 个答案:

答案 0 :(得分:0)

我没有足够的时间来提供矢量化解决方案,这是您应该总是尝试在Matlab中获得的...但这应该有效:

D = 5;

R = [
    1   3  4   NaN 2;
    3   4  2   1   NaN;
    4   3  NaN 1   1;
    NaN 1  2   3   4;
    NaN 3  2   1   4
];

M = [
    20  30  30  NaN 55    67.50;
    25  35  35  43  NaN   69.00;
    89  88  NaN 34  100  155.50;
    NaN 33  82  99  11   112.50;
    NaN 33  22  44  33    66.00
];

sel = cell(D,1);

for i = 1:D
    M_curr = M(i,:);

    R_curr = R(i,:);
    R_nan = isnan(R_curr);
    R_curr(R_nan) = -Inf;

    [~,R_idx] = sort(R_curr,'descend');
    R_idx_end = 5 - sum(R_nan);

    if (R_idx_end == 0)
        sel{i} = [];
        continue;
    end

    R_idx = R_idx(1:R_idx_end);

    M_cs = cumsum(M_curr(R_idx));
    M_cs_lim = find(M_cs <= M_curr(6));

    sel{i} = [R_idx(M_cs_lim) repmat([0],5-numel(M_cs_lim),1).'];
end

实际上,最后一部分(结果的结构)真的不清楚所以我去了一个简单的细胞结果。