0

我在 SAS/IML 中有一个矩阵:

x = {7 6 3 3 8,
     2 3 5 2 5,
     2 6 4 3 8,
     7 4 8 1 3,
     8 8 6 8 7,
     3 2 6 1 5 };

我想创建一个新矩阵,其中包含x. 例如,如果k=3,我希望结果矩阵包含:

8  8  8  8  8 
7  6  6  3  8
7  6  6  3  7

因为,例如,第一列中最大的 3 个数字x是 8、7 和 7。

我没有成功地试图弄清楚如何使用rank函数来做到这一点。

4

2 回答 2

2

你的代码看起来不错。这是一个小修改:

do c=1 to ncol(x);   
    r = rank(x[,c]);
    y = x[loc(r>=nrow(x)-k+1), c];
    call sort(y);
    tops[,c] = y;
end;

至于避免循环以使其更快,则没有必要。即使有 10,000 列,此代码也可以在几分之一秒内运行。尝试运行以下时序代码:

x = j(500, 10000);
call randgen(x,"normal");
k = 3;
t0=time();
tops = j(k,ncol(x),0);
do c=1 to ncol(x);   
    r = rank(x[,c]);
    y = x[loc(r>=nrow(x)-k+1), c];
    call sort(y);
    tops[,c] = y;
end;
t=time()-t0;
print t;
于 2012-06-29T17:09:07.173 回答
0

这是我想出的部分答案:

k = 3;
tops = j(k,ncol(x),0);
do c=1 to ncol(x);   
    r = rank(x[,c]);
    h=loc(r>=nrow(x)-k+1);
    tops[,c] = x[,c][h];
end;

这种方法使用了一个循环,我想避免这种情况,所以如果可能的话,请发布改进!

于 2012-06-29T14:55:38.070 回答