0

何千もの行を除いて、これに似たMatlabのマトリックスがあります。

A =

     5     6     7     8
     6     1     2     3
     5     1     4     8
     5     2     3     7
     5     8     7     2
     6     1     3     8
     5     2     1     6
     6     3     2     1

最初の列が '5' の 3 つのランダムな行と、最初の列が '6' の 3 つのランダムな行を持つマトリックスを取得したいと思います。したがって、この場合、出力マトリックスは次のようになります。

A =

     5     6     7     8
     6     1     2     3
     5     2     3     7
     6     1     3     8
     5     2     1     6
     6     3     2     1

行は、元の行列の最初の 3 つまたは最後の 3 つだけではなく、ランダムでなければなりません。これを開始する方法がよくわからないので、どんな助けでも大歓迎です。

編集: これは、これまでで最も成功した試みです。最初の列に「5」があるすべての行を見つけました。

BLocation = find(A(:,1) == 5);
B = A(BLocation,:);

次に、次のように「randsample」を使用して、B から 3 つのランダムな行を見つけようとしました。

C = randsample(B,3);

しかし、'randsample' は行列では機能しません。

また、これはもう少し効率的に行うことができると思います。

4

2 に答える 2

4

randsample条件、つまり 5 または 6 に等しい行インデックスで実行する必要があります。

n = size(A,1);

% construct the linear indices for rows with 5 and 6 
indexA = 1:n; 
index5 = indexA(A(:,1)==5);
index6 = indexA(A(:,1)==6);

% sample three (randomly) from each 
nSamples = 3;
r5 = randsample(index5, nSamples);
r6 = randsample(index6, nSamples);

% new matrix from concatenation 
B = [A(r5,:); A(r6,:)];

更新: findyuk が提案したように、元のインデックス構築を置き換えるために使用することもできます。これは、より高速であることが証明されています (そして最適化されています!)。

ベンチマーク(MATLAB R2012a )

A = randi(10, 1e8, 2); % 10^8 rows random matrix of 1-10

tic;
n = size(A,1);
indexA = 1:n;
index5_1 = indexA(A(:,1)==5);
toc

tic;
index5_2 = find(A(:,1)==5);
toc

Elapsed time is 1.234857 seconds.
Elapsed time is 0.679076 seconds.
于 2013-04-04T02:01:44.420 に答える