Operands to the || and && operators must be convertible to logical scalar values.

6 vues (au cours des 30 derniers jours)
Mehdi Jaiem
Mehdi Jaiem le 5 Mai 2022
Modifié(e) : Mehdi Jaiem le 6 Mai 2022
So I don't understand the reason why I am getting the following error:
riskUserId=[];
if (data.A>5) || (data.B==1)
C=data.D;
end
data is a table
A is of type double
B is of type logical (0s and 1s)
I am still getting used to this table logic and cell content type of data.
  2 commentaires
Geoff Hayes
Geoff Hayes le 5 Mai 2022
@Mehdi Jaiem - if data is a table, then what does this mean to you
data.Age>60
? Should there be one age greater than 60 or all ages greater than 60?
Mehdi Jaiem
Mehdi Jaiem le 5 Mai 2022
Well actually data.Age accesses all the column Age in the table Data
Name First Name User_ID Contact_ID Infection Preexisting_Conditions Age
____________ ______________ __________ ____________ _________ ______________________
{'Maier' } {'Alfred' } 1e+05 {1×5 double} true false 70
{'Schulz' } {'Petra' } 1e+05 {[ 100017]} false false 64
{'Schmidt' } {'Dieter' } 1e+05 {1×2 double} false false 58
{'Meier' } {'Benjamin' } 1e+05 {[ 100012]} false false 52
{'Gross' } {'Michael' } 1.0001e+05 {1×5 double} true false 46
{'Klein' } {'Nadja' } 1.0001e+05 {1×2 double} false false 40
when I use data.Age I should get the column age as output.
What I am trying to do is to save all User_IDs fulfilling the above mentioned 2 conditions with an "OR" statement in between.

Connectez-vous pour commenter.

Réponses (2)

Mitch Lautigar
Mitch Lautigar le 5 Mai 2022
riskUserId=[];
%MATLAB is expecting a 1 or 0 for preexisting conditions. IF the values in the table are true/false, use strcmpi(). This would look like (strcmpi(data.Preexisting_Conditions,"true"))
if (data.Age>60) || (data.Preexisting_Conditions==1)
riskUserId= [riskUserId;data.User_ID]; %Stack all values into an array for easy viewing.
end
  1 commentaire
Mehdi Jaiem
Mehdi Jaiem le 5 Mai 2022
The content of the column Preexisting_Conditions is already boolean:
Name First Name User_ID Contact_ID Infection Preexisting_Conditions Age
____________ ______________ __________ ____________ _________ ______________________
{'Maier' } {'Alfred' } 1e+05 {1×5 double} true false 70
{'Schulz' } {'Petra' } 1e+05 {[ 100017]} false false 64
{'Schmidt' } {'Dieter' } 1e+05 {1×2 double} false false 58
{'Meier' } {'Benjamin' } 1e+05 {[ 100012]} false false 52
{'Gross' } {'Michael' } 1.0001e+05 {1×5 double} true false 46
{'Klein' } {'Nadja' } 1.0001e+05 {1×2 double} false false 40
I tried using strcmp but it only gives me zeros and ones instead of true and false. Instead I used the followwing line.
data.Preexisting_Conditions=categorical(data.Preexisting_Conditions)=='yes';
(originally I had 'yes' and 'no' instead of 'true' and 'false')
Now the columns Preexisting_Conditions and Infection are of type
class(data.Preexisting_Conditions)
ans =
'logical'

Connectez-vous pour commenter.


Cris LaPierre
Cris LaPierre le 5 Mai 2022
Modifié(e) : Cris LaPierre le 5 Mai 2022
Use || and && when you are comparing a single (scalar) value. Use | and & when you are comparing arrays (when there is more than 1 output of the comparison).
a = 1:4;
b = 4:-1:1;
% Works
c = a>2 & b<=3
c = 1×4 logical array
0 0 1 1
% Error you are seeing
d = a>2 && b<=3
Operands to the logical AND (&&) and OR (||) operators must be convertible to logical scalar values. Use the ANY or ALL functions to reduce operands to logical scalar values.

Community Treasure Hunt

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

Start Hunting!

Translated by