Вот один из способов сделать это. Как только вы поймете, вы можете сжать его в несколько строк, но для ясности я опишу промежуточные шаги.
%% The inputs
n = 4;
input = [0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 1];
1) Разделите ваш ввод на блоки размером n
(обратите внимание, что ваша последняя функция нужно будет проверить, что число элементов в input
является целым кратным n
)
c = reshape(input,n,[]) ;
Дает вам матрицу с вашими блоками, организованными в столбцы:
c =
0 0 0 0 0
0 1 0 1 0
0 1 0 0 0
1 0 1 1 1
2) Выполните тестовое условие на каждом блоке. Для этого мы воспользуемся тем, что Matlab работает по столбцам для функции sum
:
>> cr = sum(c) >= (n/2)
cr =
0 1 0 1 0
Теперь у вас есть логический вектор cr
, содержащий столько элементов, сколько и начальных блоков. Каждое значение является результатом условия проверки по блоку. Блоки 0
останутся без изменений, для блоков 1
будет установлено значение 1
.
3) Принудительно 1
столбцы / блок для значения 1
:
>> c(:,cr) = 1
c =
0 1 0 1 0
0 1 0 1 0
0 1 0 1 0
1 1 1 1 1
4) Теперь осталось только развернуть вашу матрицу. Вы можете сделать это несколькими способами:
res = c(:) ; %% will give you a column vector
ИЛИ
>> res = reshape(c,1,[]) %% will give you a line vector
res =
0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1