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

조회 수: 7(최근 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표시숨기기 이전 댓글 수: 2
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표시숨기기 이전 댓글 수: 4
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표시숨기기 이전 댓글 수: 1
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.

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

### 범주

Find more on Loops and Conditional Statements in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by