Случайная выборка элементов из массива на основе целевого условия - PullRequest
0 голосов
/ 31 октября 2019

У меня есть массив (назовем его ElmInfo) размером Nx2, представляющий геометрию. В этом массиве номер элемента и объем элемента находятся в столбце 1 и столбце 2 соответственно. Объем элементов в значительной степени различается. Сумма объема всех элементов приводит к значению V, которое можно получить в MATLAB следующим образом:

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

Я хочу случайным образом выбрать элементы из массива ElmInfo таким образом, чтобыОбъем выбранных элементов (без повторов) приведет к целевому объему V1. Примечание: V1 меньше V. Так что я не знаю количество элементов для выборки. Я привожу пример. Для случая выборки номер элемента выборки может быть «10», тогда как в другой выборке номер элемента выборки может быть «15».

Нет простой встроенной функции MATLAB для удовлетворения целевого условия. Как я могу реализовать код в MATLAB?

1 Ответ

0 голосов
/ 05 ноября 2019

Наконец я получил ответ на свой вопрос. Вот решение, которое я получил от участника в 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);
...