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

1 回表示 (過去 30 日間)
M.S. Khan
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 件のコメント
M.S. Khan
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
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
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 件のコメント
M.S. Khan
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
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
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
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
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 Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by