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 };

の各列の最大k値を含む新しいマトリックスを作成したいと思いますx。たとえば、k = 3の場合、結果行列に次のものを含める必要があります。

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

たとえば、の最初の列の最大の3つの数字は8、7 x、および7であるためです。

ランク関数を使用してこれを行う方法を理解しようとして失敗しました。

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 に答える