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

8 views (last 30 days)
Mehdi Jaiem
Mehdi Jaiem on 5 May 2022
Edited: Mehdi Jaiem on 6 May 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 Comments
Mehdi Jaiem
Mehdi Jaiem on 5 May 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.

Sign in to comment.

Answers (2)

Cris LaPierre
Cris LaPierre on 5 May 2022
Edited: Cris LaPierre on 5 May 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.

Mitch Lautigar
Mitch Lautigar on 5 May 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 Comment
Mehdi Jaiem
Mehdi Jaiem on 5 May 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'

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by