根据目标条件从数组中随机采样元素

时间:2019-10-31 18:47:11

标签: arrays matlab random

我有一个大小为Nx2的数组(我们称其为ElmInfo),它表示一个几何图形。在该阵列中,元素编号和元素体积分别位于第1列和第2列。元素的数量变化很大。所有元素的体积之和得出一个值V,该值可以在MATLAB中获取为:

V=sum(ElmInfo(:,2));

我想从数组ElmInfo中随机抽样元素,以使抽样元素的数量(无重复)将导致目标数量V1。注意:V1小于V。所以我不知道要采样的元素数量。我举一个例子。对于采样情况,采样元素的数量可以为“ 10”,而在其他采样情况下,采样元素的数量可以为“ 15”。

没有简单的MATLAB内置函数可以满足目标条件。如何在MATLAB中实现代码?

1 个答案:

答案 0 :(得分:0)

最后,我得到了我问题的答案。这是我从MATLAB Central的贡献者那里获得的解决方案。为了方便堆栈溢出社区,我在此处发布答案。

TotVol=sum(ElmInfo(:,2));
DefVf = 1.5;            % This is the volume fraction I want to sample
% Target sample volume
DefVolm_target = TotVol*(DefVf/100);
% **************************************
n = 300;
v = ElmInfo(:,2);   
tol = 1e-6;
sample = [];
maxits = 10000;
for count = 1:maxits
    p = randperm(n);
    s = cumsum(v(p));
    k = find(abs(s - DefVolm_target) < tol);
    if ~isempty(k)
        sample_indices = p(1:k(1));
        sample = v(sample_indices);
        fprintf('Sample found after %d iterations\n', count);
        break
    end
end
DefVol_sim=sum(sample);
sampled_Elm=sort(sample_indices);