我有两个相对较大的矩阵(以下两个图表是示例)。第一个矩阵是五天内五个股票的排名(五列,但其中一列有缺失值)。第二个矩阵是五天内这五只股票的市值。我希望每天根据第一个矩阵中行的降序选择市值大小不超过第六列的股票。例如,在第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
答案 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
实际上,最后一部分(结果的结构)真的不清楚所以我去了一个简单的细胞结果。