Всем привет,

Кто-нибудь знает, как сделать случайную выборку без замены? Функция 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)

РЕДАКТИРОВАТЬ: А вот тот, который ближе к вашей версии:

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ