Loop through hundreds of matrices to change values larger than 1 to 0

조회 수: 1 (최근 30일)
Zoe
Zoe 2017년 10월 19일
댓글: Zoe 2017년 10월 23일
I have more than 400 matrices, currently I am using "find" to change the values larger than 1 in the matrix to 0 one by one manually with this code:
val = find(yf > 1);
yf(val) = 0;
Is there a way to do it with loop? Please help, thank you.
  댓글 수: 3
James Tursa
James Tursa 2017년 10월 19일
"... 400 matrices ..."
How are these matrices stored? In individual variables? As part of a cell or struct array? Or ...?
Zoe
Zoe 2017년 10월 19일
Hi Walter, those matrices are actually image data, the value I WANT is actually between 0 and 1 (definitely smaller than 1), and values larger than 1 are noise (background data, etc.)
Hi James, in a 1*452 cell array , so I use
images{1, #}
to read them one by one right now.

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

채택된 답변

Image Analyst
Image Analyst 2017년 10월 19일
If you want a loop and your images are in the cell array, you can do it like this:
for k = 1 : length(images)
% Extract his one image.
thisImage = images{1, k};
% Reduce/Clip values 1.000001 and larger to 1.
thisImage(thisImage > 1) = 1;
% Stick back into cell array
images{1, k} = thisImage;
end
  댓글 수: 3
Image Analyst
Image Analyst 2017년 10월 21일
You're welcome, but you probably never should have stored all your images in a cell array in the first place. It takes up a lot of memory and there was probably never a need to have them all in memory simultaneously. You probably could have read your images one at a time and processed them immediately in the loop without storing them all. Anyway, thanks for Accepting the answer.
Zoe
Zoe 2017년 10월 23일
Thank you for letting me know this:)

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

추가 답변 (2개)

Star Strider
Star Strider 2017년 10월 19일
Instead of find, I would simply use ‘logical indexing’.
Example
yf = 0.5 + rand(4,5)
yf(yf > 1) = 0
yf =
0.64115 1.2321 1.0209 1.3162 1.1876
1.0121 1.2498 0.71908 1.2939 1.4869
1.2213 0.90732 1.3424 0.96911 1.2699
1.4288 0.73949 1.1629 0.80952 1.3296
yf =
0.64115 0 0 0 0
0 0 0.71908 0 0
0 0.90732 0 0.96911 0
0 0.73949 0 0.80952 0
This should be more efficient, although you will still have to loop through every matrix.
  댓글 수: 2
Zoe
Zoe 2017년 10월 19일
Thank you for replying! But my question is how are you gonna do the loop?? Sorry I am relatively new to matlab, and I do know lots of functions but I dont know how to loop through my matrices.
Star Strider
Star Strider 2017년 10월 19일
That depends on how your matrices are stored. If each is in a separate file, read the file and then do the replacement.

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


James Tursa
James Tursa 2017년 10월 19일
result = cellfun(@(c)c.*(c<=1),images,'uni',false);

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by