|
我最近写了一个加权无放回抽样的matlab m文件:randsample_wor1(m,n),表示n次抽样,每次都是无放回加权抽取m个元素;权重配置表在excel表格里
之所以写这个m文件是因为,matlab里的randsample随机抽样函数,只支持加权有放回抽样,不支持加权无放回抽样;也就是只能使用randsample(s,n,true,w),而不可以使用randsample(s,n,false,w)
我写完后,发现一个怪事,键入randsample_wor1(3,4),程序正确运行了,键入randsample_wor1(3,10),就出现了出错提示
??? Error using ==> histc
Edge vector must be monotonically non-decreasing.
Error in ==> randsample at 101
[~, y] = histc(rand(k,1),edges);
Error in ==> randsample_wor1 at 10
B(i)=randsample(s,1,true,A2);
发一下我写的randsample_wor1(m,n)文件
function B=randsample_wor1(m,n)
A=xlsread('data_weight.xlsx');
A1=A(:,1);
B=zeros(m,1);
C=zeros(n,m);
s=transpose(1:1:length(A1));
for j=1:n
A2=A(:,2);
for i=1:m
B(i)=randsample(s,1,true,A2);
A2(B(i))=0;
end
for i=1:m
C(j,i)=A1(B(i));
end
end
xlswrite('randsample_wor.xlsx',C);
这种现象很不稳定,这个函数有时候出错,有时候又不出错;世事无常啊
我重新写了个函数randsample_wor(m,n),实现类似的功能,却再也不出现出错提示
function B=randsample_wor(m,n)
A=xlsread('data_weight.xlsx');
A1=A(:,1);
B=zeros(m,1);
C=zeros(n,m);
s=transpose(1:1:length(A1));
ut=0;
loc=0;
for j=1:n
A2=A(:,2);
s=transpose(1:1:length(A1));
for i=1:m
B(i)=randsample(s,1,true,A2);
[ut, loc] = ismember(B(i), s);
s(loc)=[];
A2(loc)=[];
end
for i=1:m
C(j,i)=A1(B(i));
end
end
xlswrite('randsample_wor.xlsx',C);
查了下资料http://www.mathworks.cn/matlabcentral/newsreader/view_thread/255206
(randsample bug? )
里面有个matlab的官方人员的回复,从他的口气里也不能确定问题到底发生在什么地方
热切请教matlab的高手们,能不能指点下迷津 |
|