less than or equal and greater than of equal operations

5 vues (au cours des 30 derniers jours)
ektor
ektor le 4 Août 2018
Modifié(e) : jonas le 4 Août 2018
Dear all,
I have this vector
DIFF=[ 0
0.0500
-0.0200
0.0100
-0.0400
0
0
0
0.0500
0
0.0200
0
0.0100
0
-0.0100
0
-0.1500
0
-0.0100
0];
and I want to make the following tranformation:
The values of DIFF<-0.02 to be tranformed to 1
The values of DIFF>=-0.02 & DIFF<-0.01 to be tranformed to 2
The values of DIFF>=-0.01 & DIFF<=0 to be tranformed to 3
The values of DIFF>0 & DIFF<=0.01 to be tranformed to 4
The values of DIFF>0.01 & DIFF<=0.02 to be tranformed to 5
The values of DIFF>0.02 to be tranformed to 6
So I constructed the following code
c1= -0.02;
c2= -0.01;
c3= 0;
c4= 0.01;
c5= 0.02;
kk=size(DIFF,1);
vy=zeros(kk,1);
f1=find( DIFF<c1);
f2=find(DIFF>=c1 & DIFF<c2);
f3=find(DIFF>=c2 & DIFF<=c3);
f4=find(DIFF>c3 & DIFF<=c4);
f5=find(DIFF>c4 & DIFF<=c5);
f6=find(DIFF>c5);
vy(f1)=1;
vy(f2)=2;
vy(f3)=3;
vy(f4)=4;
vy(f5)=5;
vy(f6)=6;
And I finally obtain the following matrix
DATA_NEW=[vy DIFF]
3.0000 0
6.0000 0.0500
1.0000 -0.0200
4.0000 0.0100
1.0000 -0.0400
3.0000 0
3.0000 0
3.0000 0
6.0000 0.0500
3.0000 0
5.0000 0.0200
3.0000 0
4.0000 0.0100
3.0000 0
3.0000 -0.0100
3.0000 0
1.0000 -0.1500
3.0000 0
3.0000 -0.0100
3.0000 0
But as you can see from the third element of DATA_NEW, the value of 1 is assigned to -0.02. But according to my categorization, the value of 2 should have been assigned to -0.02.
Similarly, the value of 6 is assigned to 0.05, but it should be the value of 5.
How could I rectify this problem given the fact that my real DIFF vector contains thousands of elements.
Thanks in advance

Réponse acceptée

Star Strider
Star Strider le 4 Août 2018
The vector you posted may not be showing the full precision of the values in it. If you calculated them (or imported them without looking at them), they may not be what they seem. See Why is 0.3 - 0.2 - 0.1 (or similar) not equal to zero? (link) for an explanation.
  2 commentaires
ektor
ektor le 4 Août 2018
Modifié(e) : ektor le 4 Août 2018
the displayed vector is of full precision. I also used
format shortG
I use Matlab R2017a.
Star Strider
Star Strider le 4 Août 2018
With the data you posted, I got (in R2018a):
DATA_NEW =
3 0
6 0.05
2 -0.02
4 0.01
1 -0.04
3 0
3 0
3 0
6 0.05
3 0
5 0.02
3 0
4 0.01
3 0
3 -0.01
3 0
1 -0.15
3 0
3 -0.01
3 0
If you use:
format long g
you will likely see the problem.

Connectez-vous pour commenter.

Plus de réponses (1)

jonas
jonas le 4 Août 2018
Modifié(e) : jonas le 4 Août 2018
There is no problem with your code. In fact, if you copy your code as written in the question, you get the following results.
ans
3.0000 0
6.0000 0.0500
2.0000 -0.0200
4.0000 0.0100
1.0000 -0.0400
3.0000 0
3.0000 0
3.0000 0
6.0000 0.0500
3.0000 0
5.0000 0.0200
3.0000 0
4.0000 0.0100
3.0000 0
3.0000 -0.0100
3.0000 0
1.0000 -0.1500
3.0000 0
3.0000 -0.0100
3.0000 0
I am guessing that the value displayed as -0.0200 is actually less than -0.02.
Try writing
DIFF(3)-0.02
The answer will be less than zero, which implies that DIFF(3) is less than -0.02.
As a sidenote, you can substitute the find command with logical indexing. Instead of
f1=find(DIFF<c1);
vy(f1)=1;
you can write
vy(DIFF<c1)=1
  2 commentaires
ektor
ektor le 4 Août 2018
Modifié(e) : ektor le 4 Août 2018
I set
DIFF(3)==-0.02
but again the same problem. you can try yourself to verify this.
I use Matlab R2017a
jonas
jonas le 4 Août 2018
Modifié(e) : jonas le 4 Août 2018
What do you mean, again the same problem? I am quite sure that
DIFF(3)==-0.02
returns 0 in your case, because the number displayed as -0.02 is actuall less than -0.02 (e.g. -0.02000000000001), otherwise you would not be asking this question. It is not a problem, the code works as intended.
I can not verify this, because the numbers you posted are not the same as the ones you have in your workspace. Instead, you can try to clear your workspace and replace it with the code you gave us in your question. I am confident that you will get the (according to you) correct result.
Note that you do not SET anything when you use two equal signs, you TEST whether DIFF(3) is equal to -0.02. Change it to single equal sign and you will get the "correct" results.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by