从帖子中您要达到的目标并不完全清楚。这是一个基于猜测的观点,有多种选择。
您的前两个“表格”存储股票和日期的符号(与排名无关)。你的第三和第四是按某种方式排列的分数stock x day
。让我们假设股票是垂直的,天是水平的,股票的符号是[1:10]
.
N = 10; % num of stocks
M = 10; % num of days
T3 = rand(N,M); % table 3 stocks x days
T4 = rand(N,M); % table 4 stocks x days
按升序和降序对分数表进行排序(以获得每天的高低分数,即每列):
[Sl,L] = sort(T3, 'descend');
[Ss,S] = sort(T4, 'ascend');
保持三个最大和最小:
largest = L(1:3,:); % bucket of 3 largest per day
smallest = S(1:3,:); % bucket of 3 smallest per day
如果您需要两者中的那些(0是nan):
% Inter-section of both buckets
indexI = zeros(3,M);
for i=1:M
z = largest(ismember(largest(:,i),smallest(:,i)));
if ~isempty(z)
indexI(1:length(z),i) = z;
end
end
如果您需要其中任何一个(0 是 nan):
% Union of both buckets
indexU = zeros(6,M);
for i=1:M
z = unique([largest(:,i),smallest(:,i)]);
indexU(1:length(z),i) = z;
end
如果您需要从 maximum_of_3 和 minimum_of_4 集合中对分数/股票进行排名:
scoreAll = [Sl(1:3,:); Ss(1:3,:)];
indexAll = [largest;smallest];
[~,indexSort] = sort(scoreAll,'descend');
for i=1:M
indexBest(:,i) = indexAll(indexSort(1:3,i),i);
end
更新
要获得最终分数的加权排名,请在排序之前定义权重向量(1 x 分数)并使用以下两个选项之一,scoreAllW
而不是scoreAll
:
w = [0.3 ;0.3; 0.3; 0.7; 0.7; 0.7];
scoreAllW = scoreAll.*repmat(w,1,10); % Option 1
scoreAllW = bsxfun(@times, scoreAll, w); % Option 2