2 views (last 30 days)

I have an array of 200 values. This is the operation I need to program:

The value in the position X minus the value in the position Y EQUALS 0.55. Therefore, I am using a for loop and If statement.

The problem is that I know neither value nor the position of each value. I guess both of them are in the first 50 values of the array. So, how can I code the operation below n times (k-1, k-2, k-3 ...) until I got this number, and disp the 'Here'?

I;

for k =length (I)

x=I(k)-I %Take last value and substract the first value of I, second, k times to the last value.

if x==0.55

disp 'Here'

else

disp 'Not here'

end

end

Guillaume
on 1 Feb 2020

Edited: Guillaume
on 1 Feb 2020

If you are trying to find the indices X and Y for which I(X) - I(Y) is equal to a given values, this is easily done without a loop with:

[X, Y] = find(I - I.' == seachvalue); %I must be a vector

This will returrn all the XY pairs that match.

Guillaume
on 2 Feb 2020

"There is no value for X and Y."

Then there's no values in your array whose difference is exactly equal to the search value.

As pointed out by Image Analyst, if you're comparing floating points values that have been calculated differently or have been rounded then you can't use ==. Instead you must compare against an arbitrary tolerance.

It doesn't change the fact that it can all be done in one line without a loop:

tol = 1e-4; %it's up to you to choose a tolerance value that makes sense for the magnitude of the numbers you want to compare

[X, Y] = find(abs(I - I.' - seachvalue) <= tol)

Image Analyst
on 2 Feb 2020

round() can round the number(s) to any number of decimal points that you want.

Subhadeep Koley
on 1 Feb 2020

Try this.

for k = 2:length(I)

x = I(k) - I(k-1);

if x == 0.55

disp('Here');

else

disp 'Not here'

end

end

Image Analyst
on 1 Feb 2020

Edited: Image Analyst
on 1 Feb 2020

First of all read the FAQ : Click here to learn why you shouldn't use == to compare floating point values. You should use ismembertol():

x = zeros(size(I));

for k = 1 : length(I)

% Take last value and substract the first value of I, second, k times to the last value.

% I have no idea what the above means but let's subtract I(1) and see

x(k) = I(k) - I(1);

if ismembertol(x(k), 0.55, 0.004)

fprintf(' ----> Found a match at index %d where I(%d) = %f and x = %f.\n', k, k, I(k), x);

break; % Let's quit when we find a match.

else

fprintf('Found no match at index %d where I(%d) = %f and x = %f.\n', k, k, I(k), x(k));

end

end

histogram(x);

Image Analyst
on 1 Feb 2020

Why use a loop? To subtract all values from I(1) and get a new vector with those differences, do

IDiff = I(1) - I;

Then to see which are closer than 0.004 (or whatever tolerance you want) to 0.55, do

indexes = find(abs(IDiff - 0.55) > 0.004);

I don't see how any loop is needed.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.