I am having problem creating the loop for the task.
Thres = 0.17;
istrue1= ((x>=928 & x<=1139) & y>=Thres)|((x>=2527 & x<=2856) & y>=Thres)|((x>=4113 & x<=4376) & y>=Thres)|((x>=5464 & x<=5643) & y>=Thres)|((x>=7254 & x<=7604) & y>=Thres);
TP = sum(istrue1);
Using the command I can find out the value of TP for a particular value of thres. But I want to vary the value of thres from 0:0.1:1 and want to get 10 values of TP simultaneously rather than changing Thres each time. I know it is easy but not for me. Please help.

 Akzeptierte Antwort

dpb
dpb am 4 Apr. 2020

0 Stimmen

Thres = 0.17;
istrue1=((x>= 928 & x<=1139) & y>=Thres) | ...
((x>=2527 & x<=2856) & y>=Thres) | ...
((x>=4113 & x<=4376) & y>=Thres) | ...
((x>=5464 & x<=5643) & y>=Thres) | ...
((x>=7254 & x<=7604) & y>=Thres);
is same as
istrue1=(x>= 928 & x<=1139 | ...
x>=2527 & x<=2856 | ...
x>=4113 & x<=4376 | ...
x>=5464 & x<=5643 | ...
x>=7254 & x<=7604) & y>=Thres);
Is place for my "syntactic sugar" helper utility iswithin...
istrue1=(iswithin(x, 928,1139) | ...
iswithin(x,2527,2856) | ...
iswithin(x,4113,4376) | ...
iswithin(x,5464,5643) | ...
iswithin(x,7254,7604)) & y>=Thres);
to reduce the clutter of all the tests conditions by moving into the function.
function flg=iswithin(x,lo,hi)
% returns T for values within range of input
% SYNTAX:
% [log] = iswithin(x,lo,hi)
% returns T for x between lo and hi values, inclusive
flg= (x>=lo) & (x<=hi);
end

2 Kommentare

SUBHAJIT KAR
SUBHAJIT KAR am 5 Apr. 2020
In this case How to input various ranges for x? The function will take only one lo and hi.
dpb
dpb am 5 Apr. 2020
As shown, it doesn't replace the individual tests, just hides the clutter.
I don't see any brilliant vectorizing available here; could build a function that looped over an array of lo, hi intervals or write the loop construct at this level would probably be my choice if there are variable numbers of regions and do this much. It's a situation haven't run into in my own code so hadn't attacked it, specifically.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Image Analyst
Image Analyst am 4 Apr. 2020
Bearbeitet: Image Analyst am 4 Apr. 2020

1 Stimme

Rather than be so complicated, break it into parts, like
term1 = (x>=928 & x<=1139)
term2 = y>=Thres
term3 = (x>=2527 & x<=2856)
and so on. Then look at the size and values of each term. This is just basic debugging... Then
put Thresh into a loop
Thres = [0 : 0.1 : 1];
for k = 1 : length(Thres)
thisThres = Thres(k);
istrue1 = ...... function thisThresh instead of Thres
end

4 Kommentare

SUBHAJIT KAR
SUBHAJIT KAR am 4 Apr. 2020
Bearbeitet: SUBHAJIT KAR am 4 Apr. 2020
Thanks Everyone. Your help make MATLAB so much interesting. Please help me on this.Since x is a vector of length 8000 and I need 10 threshold values Thres= 0:0.1:1 Can I preallocate a vector z = zeros(10,8000) to store the result of istrue1 and consequently find the values of each TP?
Image Analyst
Image Analyst am 4 Apr. 2020
Bearbeitet: Image Analyst am 4 Apr. 2020
You can preallocate using the lengths of the x and Thres vectors like this:
z = zeros(length(Thres), length(x));
By the way, the length of Thres is not 10:
>> length( 0:0.1:1 )
ans =
11
Many Thanks. It is working Perfectly. I have modified the code as :
Thres = [0 : 0.1 : 1];
z = zeros(1,length(Thres));
for k = 1 : length(Thres)
thisThres = Thres(k);
istrue1 = ((x>=928 & x<=1139) & y>=thisThres)|((x>=2527 & x<=2856) & y>=thisThres)|((x>=4113 & x<=4376) & y>=thisThres)|((x>=5464 & x<=5643) & y>=thisThres)|((x>=7254 & x<=7604) & y>=thisThres);
TP = sum(istrue1);
z(k) = TP;
end
SHAIK
SHAIK am 26 Feb. 2024
from the above code what is y.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Performance and Memory finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 4 Apr. 2020

Kommentiert:

am 26 Feb. 2024

Community Treasure Hunt

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

Start Hunting!

Translated by