Всем привет,
Кто-нибудь знает, как сделать случайную выборку без замены? Функция randsample в Matlab поддерживает выборку только с заменой.
Я сделал коды самостоятельно, и это действительно странно, иногда это работает, но иногда выдает ошибку (Ошибка с использованием ==> randsample на 94 Вт должна иметь длину, равную N.):
function C=randsample_WithoutReplacement(m,n,A1,A2) %A1:population %A2:probability B=zeros(m,1); C=zeros(n,m); s=transpose(1:1:length(A1)); ut=0; loc=0; A=A2; for j=1:n A=A2; s=transpose(1:1:length(A1)); for i=1:m B(i)=randsample(s,1,true,A); [ut, loc] = ismember(B(i), s); s(loc)=[]; A(loc)=[]; end for i=1:m C(j,i)=A1(B(i)); end end
ПРИМЕЧАНИЕ.
Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech ,ME,M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.
Вот рекурсивная функция, которая вернет одну строку вашей матрицы C:
function y = randsampleWithoutReplacement(population,k,w) y = []; if ~isempty(population) && k > 0 n = length(population); ii = randsample(1:n,1,true,w); newpop = setdiff(1:n,ii); y = [population(ii) randsampleWithoutReplacement(population(newpop),k-1,w(newpop))]; end
а вот пример вызова:
y = randsampleWithoutReplacement(1:100,20,ones(100,1)/100)
РЕДАКТИРОВАТЬ: А вот тот, который ближе к вашей версии:
СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ