MATLAB Answers

Zoe
0

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

Asked by Zoe
on 19 Oct 2017
Latest activity Commented on by Zoe
on 23 Oct 2017
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 Comments

Could you confirm that you want values between 0 and 1 exactly to be left alone? If the rule were that positive values were to be replaced by 0 then the operation is a bit more efficient.
"... 400 matrices ..."
How are these matrices stored? In individual variables? As part of a cell or struct array? Or ...?
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.

Sign in to comment.

Tags

3 Answers

Answer by Image Analyst
on 19 Oct 2017
 Accepted Answer

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 Comments

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.
Thank you for letting me know this:)

Sign in to comment.


Answer by Star Strider
on 19 Oct 2017

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 Comments

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.
That depends on how your matrices are stored. If each is in a separate file, read the file and then do the replacement.

Sign in to comment.


Answer by James Tursa
on 19 Oct 2017

result = cellfun(@(c)c.*(c<=1),images,'uni',false);

  0 Comments

Sign in to comment.