次のように、1 と 0 を含むK
列と行のランダムな行列を生成する必要があります。N
a) 各行には正確に 1 が含まれk
ます。
b) 各行は他の行とは異なります (組み合わせ論では、N
>行nchoosek(K, k)
がある場合に課せられnchoosek(K,k)
ます)。
N = 10000
(すべての可能な組み合わせのうち) k 個 ( ) の 1 と0を含むnchoosek(K, k) = 27405
異なる 1×K ベクトル ( ) が必要であると仮定します。K = 30
k = 4
K - k
このコード:
clear all; close
N=10000; K=30; k=4;
M=randi([0 1],N,K);
plot(sum(M,2)) % condition a) not satisfied
a) も b) も満たさない。
このコード:
clear all; close;
N=10000;
NN=N; K=30; k=4;
tempM=zeros(NN,K);
for ii=1:NN
ttmodel=tempM(ii,:);
ttmodel(randsample(K,k,false))=1; %satisfies condition a)
tempM(ii,:)=ttmodel;
end
Check=bi2de(tempM); %from binary to decimal
[tresh1,ind,tresh2] = unique(Check);%drop the vectors that appear more than once in the matrix
M=tempM(ind,:); %and satisfies condition b)
plot(sum(M,2)) %verify that condition a) is satisfied
%Effective draws, Wanted draws, Number of possible combinations to draw from
[sum(sum(M,2)==k) N nchoosek(K,k) ]
条件 a) と部分的に条件 b) を満たします。N
NN>>N でない限り、最終的な行列に含まれる行が互いに異なる行よりも少ないため、部分的に言います。
問題を解決するためのより良い、より高速な方法 (for サイクルと NN>>N の必要性を回避する可能性がある) はありますか?