我需要生成包含一和零的K
列和N
行的随机矩阵,例如:
a)每一行都包含k
一个。
b) 每一行都与其他行不同(组合学规定如果N
>nchoosek(K, k)
就会有nchoosek(K,k)
行)。
假设我想要N = 10000
(在所有可能的nchoosek(K, k) = 27405
组合中),不同的 1×K 向量(with K = 30
)包含 k 个(with 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)。我说部分是因为除非 NN>>N 最终矩阵将包含少于N
彼此不同的行。
有没有更好更快的方法(可能避免for循环和需要NN>>N)来解决问题?