Генерирование определенного блока последовательности чисел в matlab

oldflatop спросил: 12 мая 2018 в 04:10 в: matlab

Мне нужно создать последовательность из 8 блоков чисел. Размеры блоков могут варьироваться от 28 до 32. Часть, которую я застрял, состоит в том, что сумма всех блоков должна быть конкретным числом. Скажем, 243.

Я пробовал блок цикла за блоком, где размер блока генерируется случайным образом между этими значениями, но последний блок либо получает большую, либо большую часть времени. Я могу сохранить это, пока я не получу несколько таких работ, но это не так эффективно.

Я уверен, что есть лучший способ. Спасибо за любую помощь. Лучшие пожелания.


1 ответ

Hein Wessels ответил: 12 мая 2018 в 04:40

Рассчитайте 8 блоков, как вы делаете в данный момент. Тогда сумма всех этих блоков будет больше или меньше, чем желаемая сумма.

Затем добавьте все блоки вместе и найдите фактическую сумму. Например:

blocks = randn(8,28);
actual_sum = sum(sum(blocks));
desired_sum = 243;

Затем вы вычисляете коэффициент, при котором вы должны умножить все значения с целью достижения желаемой суммы. Например:

ratio = desired_sum/actual_sum;

Затем вы просто умножаете все свои блоки с этим коэффициентом, и вы достигнете своей цели. Например:

blocks = blocks * ratio;

Это приведет к значениям с десятичными знаками (или плаваниями). Если вы хотите, чтобы целые числа округляли все значения и немного корректировали последний блок с той разницей, которую это создало. Например:

blocks = round(blocks,0);
diff = sum(sum(blocks)) - desired_sum;
blocks(1,1) = blocks(1,1) - diff;
if sum(sum(blocks))==desired_sum
    fprintf("It works!");
end

Отказ от ответственности: У меня нет Matlab со мной, поэтому вам может понадобиться исправить некоторые имена функций или так далее. Метод, стоящий за ним, должен быть прочным.