Поиск индексов строк состоящих только из одних единиц в Matlab
Нужно провести деление матрицы на две новые матрицы, если 4 строки подряд полностью состоят из одних единиц, только те что в середине, при этом верхние и нижние строки из всех единиц во внимание не брать .
До чего смогда дойти это полностью удалить все единичные строки в матрице.
T = [ 1 1 1 1 1 1 1 1 1 1;
0 0 0 0 0 1 0 0 0 0;
0 1 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
0 0 0 0 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 1 0;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1];
Azer=ones(1,length(T(1,:)));
n=length(T(:,1));
for jj=n:-1:1
if T(jj,:)==Azer;
T(jj,:)=[];
end
end;
И найти индексы всех едичных строк:
[x,~] = find(B == 1);
One = x(1:8)'; % берем одно вхождение всех (всего размерность х=80, делим их на 10 (это столбцов) отсюда 8).
А как сделать чтобы искались индексы только тех которые стоят друг по 4 по порядку. При том матрица может быть намного больше.
Логично для этого надо задать матрицу [4*размерность матрицы] из одних единиц и сравнивать с каждыми 4 строками матрицы. А потом в отдельную переменную через find записать индексы. Но как Matlab это осуществит будь матрица вот такой? Индексы же будут дублироваться по несколько раз.
T = [ 1 1 1 1 1 1 1 1 1 1;
0 0 0 0 0 1 0 0 0 0;
0 1 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
0 0 0 0 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 1 0;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1;
1 1 1 1 1 1 1 1 1 1];
Как такую вещь выполнить в Matlab. Помогите и подскажите пожалуйста!
В дальнейшем это хотелось бы применить для обработки бинарных изображений, а там размерность до 1024*1024. И обработка вовсе усложняется.
Ответы
На какие матрицы? Какого размера? Из каких элементов состоящие? Каковы условия формирования матриц?
Найти индексы единичных строк и убрать эти строки можно так:
A=prod(T,2);
x=find(A); % определение индексов единичных строк
T(x,:)=[];
Как вариант, для заданной матрицы Т.
A = all(T,2);
out = double(diff([~A(1);A(:)]) == 1);
v = accumarray(cumsum(out).*A(:)+1,1);
out(out == 1) = v(2:end);
idx_consec_4s = out >= 4;
In universities, MATLAB is one of the most used computing wordle game tools for teaching, learning, and research.