How to use For loop or any other loop to rearrange elements in a matrix using Matlab?
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
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 Commenti
Walter Roberson
il 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.
Risposte (2)
Ameer Hamza
il 28 Nov 2020
Modificato: Ameer Hamza
il 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
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/432463/image.png)
after
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/432468/image.png)
5 Commenti
Walter Roberson
il 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 Commenti
Walter Roberson
il 29 Nov 2020
Modificato: Walter Roberson
il 29 Nov 2020
Yes, it is possible. However, it is not worth doing considering the option of using bwskel.
Vedere anche
Categorie
Scopri di più su Graphics Object Programming in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!