# How to use For loop or any other loop to rearrange elements in a matrix using Matlab?

조회 수: 5 (최근 30일)
M.S. Khan 2020년 11월 28일
편집: Walter Roberson 2020년 11월 29일
using the attache file for matrix. i am using for loop but i am making mistake some where.
My objective in the columns or rows should contains elements eithr 1 or 3 to generate a boundary of the sphere while the remaining elements should be zero.
For example, if in a row: 3 3 0 0 ... 1, i want first element or last element should be either 1 or 3 but other elments inside of the row or column should be zero. So it should be like: 3 0 0 0 .. 1
Any guidance please. Thanks in advance.
matrix = load('Boundary_closed_1s_3s.txt')
[m, n] = size(matrix)
For i = 1:m
for j = 1:n
if matrix(i,j)==3
else
matrix(i,j)==0
end
end
end
##### 댓글 수: 3이전 댓글 1개 표시이전 댓글 1개 숨기기
M.S. Khan 2020년 11월 28일
Then outcome should be like: 0 0 3 0 0 0 0 0 3 0
Regards for reply.
Walter Roberson 2020년 11월 28일
Is the rule that you should alternate taking the first and last of each group? I see places in the file where there are a number of different groups on the same row.

댓글을 달려면 로그인하십시오.

### 답변 (2개)

Ameer Hamza 2020년 11월 28일
편집: Ameer Hamza 2020년 11월 28일
Try this
M = readmatrix('Boundary_closed_1s_3s.txt');
for i = 1:size(M,1)
idx1 = find(M(i,:), 1, 'first');
idx2 = find(M(i,:), 1, 'last');
M(i, idx1+1:idx2-1) = 0;
end
imshow() of matrix before
after
##### 댓글 수: 5이전 댓글 3개 표시이전 댓글 3개 숨기기
M.S. Khan 2020년 11월 28일
i have marked the elements which i dont want because these elements dont represent the boundary of the sphere. i want to repalce them either with 1 or 0. Thanks for all cooperation.
M.S. Khan 2020년 11월 28일
Dr. Ameer, i am trying to utilize your code of find function to introduce 0 between first '1' and last '1', so automatically 3 will be replaced with 0 but its not coming i dont know why.

댓글을 달려면 로그인하십시오.

Walter Roberson 2020년 11월 28일
The following code is untested.
M = readmatrix('Boundary_closed_1s_3s.txt');
position_of_first = sum(cumprod(~M, 2),2) + 1;
position_of_last = size(M,2) - sum(cumprod(fliplr(~M),2),2);
rows_with_data = find(position_of_last ~= 0);
newM = sparse([rows_with_data, rows_with_data], [position_of_first(rows_with_data), position_of_last(rows_with_data)], 1);
When you examine the results, I suspect you will want to redefine the problem. For example on row 4, that stretch of 1's will be replaced by just the first 1 and the last 1, but that will leave an empty upper boundary for rows 13 and 14.
I would suggest to you that you would be better of taking logical(M) and then using bwskel() https://www.mathworks.com/help/images/ref/bwskel.html or similar morphological operations.
##### 댓글 수: 2없음 표시없음 숨기기
M.S. Khan 2020년 11월 29일
Thanks Walter for your support. Problem is still there. can we use a for loop to locate the 3s which are coming in the next row or colmun to replace with o. i am thinking how to apply that approach.
Walter Roberson 2020년 11월 29일
편집: Walter Roberson 2020년 11월 29일
Yes, it is possible. However, it is not worth doing considering the option of using bwskel.

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Graphics Object Programming에 대해 자세히 알아보기

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by