我有一个大小为Nx2的数组(我们称其为ElmInfo
),它表示一个几何图形。在该阵列中,元素编号和元素体积分别位于第1列和第2列。元素的数量变化很大。所有元素的体积之和得出一个值V
,该值可以在MATLAB中获取为:
V=sum(ElmInfo(:,2));
我想从数组ElmInfo
中随机抽样元素,以使抽样元素的数量(无重复)将导致目标数量V1
。注意:V1
小于V
。所以我不知道要采样的元素数量。我举一个例子。对于采样情况,采样元素的数量可以为“ 10”,而在其他采样情况下,采样元素的数量可以为“ 15”。
没有简单的MATLAB内置函数可以满足目标条件。如何在MATLAB中实现代码?
答案 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);