Effacer les filtres
Effacer les filtres

Logical with complex numbers in a vector

6 vues (au cours des 30 derniers jours)
Hmm!
Hmm! le 23 Fév 2021
Commenté : Hmm! le 1 Mar 2021
I have a complex number in a vector,
e =
-0.0000
3.0000
9.0000
>> logical(e) %checking if the the first entry is actually 0. Results show it is not
ans =
3×1 logical array
1
1
1
>> t = sqrt(e) % sqauring the entries shows all the three entries are complex numbers
t =
0.0000 + 0.0000i
1.7321 + 0.0000i
3.0000 + 0.0000i
L = logical(t) % In Matlab documentation it not possible to use logical for complex numbers
Error using logical
Complex values cannot be converted to logicals.
>> t(1,1)==0 % checking if the first entry is actually 0?
ans =
logical
0
>> t(1,1)<0 % checking if the first entry is actually less than 0?
ans =
logical
0
>> t(1,1)>0 % checking if the first entry is actually greater than 0?
ans =
logical
0
% QUESTION: is there a way to compare t(1,1) with 0 to know whether is it 0 or not?
% Alternatively: What is the genral way of using logicals for complex numbers?

Réponse acceptée

Walter Roberson
Walter Roberson le 26 Fév 2021
e = [-1e-9;3;9;0]
e = 4×1
-0.0000 3.0000 9.0000 0
t = sqrt(e);
[real(t), imag(t)]
ans = 4×2
0 0.0000 1.7321 0 3.0000 0 0 0
t == 0
ans = 4x1 logical array
0 0 0 1
format long g
e
e = 4×1
-1e-09 3 9 0
[real(t), imag(t)]
ans = 4×2
0 3.16227766016838e-05 1.73205080756888 0 3 0 0 0
You are being mislead by your default output format. If you switch output formats you will be able to see quickly that your e(1) is a small negative value.
You can see that t == 0 is enough to compare both parts of a complex number to 0, and correspondingly,
Lt = t ~= 0
Lt = 4x1 logical array
1 1 1 0
is the equivalent of logical()

Plus de réponses (2)

Image Analyst
Image Analyst le 27 Fév 2021
Perhaps this:
complexVector =[
0.0000 + 0.1000i
1.7321 + 0.0010i
3.0000 + 0.0000i]
% Define a tolerance:
tolerance = 0.01
% Find out which elements have an imaginary magnitude less than tolerance:
belowTolerance = imag(complexVector) < tolerance
% For those elements with an imaginary value below the tolerance,
% turn them into a real number with no imaginary component.
complexVector(belowTolerance) = real(complexVector(belowTolerance))
You get:
complexVector =
0 + 0.1i
1.7321 + 0.001i
3 + 0i
tolerance =
0.01
belowTolerance =
3×1 logical array
0
1
1
complexVector =
0 + 0.1i
1.7321 + 0i
3 + 0i
Note the second and third elements are real, not complex, numbers because the imaginary part was stripped off.
  1 commentaire
Hmm!
Hmm! le 1 Mar 2021
You're also right. Thanks for the help

Connectez-vous pour commenter.


David Hill
David Hill le 23 Fév 2021
%depends on what you are trying to compare
real(t)==0;
imag(t)==0;
norm(t)==0;
  7 commentaires
Walter Roberson
Walter Roberson le 27 Fév 2021
A = ([-1 1 0; -1 0 1; 0 -1 1; -2 1 1]);
e=eig(A'*A)
e = 3×1
-0.0000 3.0000 9.0000
f = sqrt(e);
format short
[real(e), imag(e)]
ans = 3×2
-0.0000 0 3.0000 0 9.0000 0
[real(f), imag(f)]
ans = 3×2
0 0.0000 1.7321 0 3.0000 0
f ~= 0
ans = 3x1 logical array
1 1 1
format long g
[real(e), imag(e)]
ans = 3×2
-1.06895079652153e-16 0 3 0 9 0
[real(f), imag(f)]
ans = 3×2
0 1.03390076725067e-08 1.73205080756888 0 3 0
f ~= 0
ans = 3x1 logical array
1 1 1
You can see from this that the first entry in e is truly not 0... it just looks that way when you have "format short" in effect.
You can also see that comparing ~= 0 is successful in detecting that the imaginary component is not 0, which is what you want.
As = sym(A)
As = 
es = eig(As'*As)
es = 
Working with symbolic values shows us that the ideal value for the first eigenvalue is exact 0; the -1e-16 is due to numeric round-off.
Hmm!
Hmm! le 27 Fév 2021
You're right.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits


Version

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by