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

7 views (last 30 days)
M.S. Khan
M.S. Khan on 28 Nov 2020
Edited: Walter Roberson on 29 Nov 2020
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 Comments
Walter Roberson
Walter Roberson on 28 Nov 2020
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.

Sign in to comment.

Answers (2)

Ameer Hamza
Ameer Hamza on 28 Nov 2020
Edited: Ameer Hamza on 28 Nov 2020
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 Comments
M.S. Khan
M.S. Khan on 28 Nov 2020
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.

Sign in to comment.


Walter Roberson
Walter Roberson on 28 Nov 2020
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 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by