Asked by Pilar Jiménez
on 15 Oct 2019

Good day,

Hopefully you can help me with a question, I have a data array, with 18 specific data. I want to make certain operations based on the value in the array. What I don't know is how to write the conditions, I know I need an if and the operator "or" which is "||", I have used it but it doesn't do what I want, so I think I'm misusing the idea.

What I want to achieve is that if the value I have in array C, in the order in which it, is equal to 5, 6 or 7, the data variable is divided by 188, if the value is 8,9,10,11 , 12,13,14,15,16 or 17 the variable data is divided by 396 and if the value is greater than or equal to 18, then it is divided by 1659.5; and the result of the operation is stored in a new array called N for each value. But I have an error because the "or" operator is not used correctly and how to ensure that operations can be performed depending on the value.

I hope you can help me, thanks in advance.

This is the code I have:

C=[10 8 34 7 7 24 11 15 10 13 13 20 17 39 6 9 5 21];

data=2200;

for i=1:length(C)

if C(i)==5||6||7

N(i)=data/188;

elseif C(i)==8||9||10||11||12||13||14||15||16||17

N(i)=data/396;

else C(i)<=18

N(i)=data/1659.5;

end

end

Answer by per isakson
on 15 Oct 2019

Edited by per isakson
on 16 Oct 2019

Accepted Answer

This works accourding to your expectations - I think.

%%

C=[10,8,34,7,7,24,11,15,10,13,13,20,17,39,6,9,5,21];

data=2200;

for i=1:length(C)

if ismember( C(i), [5,6,7] )

N(i)=data/188;

elseif ismember( C(i), [8,9,10,11,12,13,14,15,16,17] )

N(i)=data/396;

elseif C(i)<=18

N(i)=data/1659.5;

else

keyboard

end

end

From the top of my head

- Matlab has been around since the seventies, that's more than fourty years.
- Back then there was one data type, matrix of doubles. A scalar was a <1x1> matrix.
- When doing conditional stuff zero was interpreted as false and non-zeros as true
- Text was ascii-numbers interpreted as characters
- etc

This in combination with Mathworks' reluctance to break users code has resulted in Matlab containing old code that isn't documented.

|| and && is supposed to operate on logicals, however

>> 13&&17

ans =

logical

1

>> 13||17

ans =

logical

Thus all your conditions evaluate to true

>> 17==5||6||7

ans =

logical

1

>>

Or what do you think about

>> ['A':2:'H']

ans =

'ACEG'

>> ['A':' ':'z']

ans =

'Aa'

Pilar Jiménez
on 15 Oct 2019

Thank you, it works correctly and is shorter than how I solved it. I prefer your answer.

It can also be solved in another way:

for i=1:length(C)

if C(i)==5||C(i)==6;

N(i)=data/188.5;

elseif C(i)==8||C(i)==9||C(i)==10||C(i)==11||C(i)==12||C(i)==13||C(i)==14||C(i)==15||C(i)==16||C(i)==17;

N(i)=data/396;

else C(i)>=18;

N(i)=data/1659.5;

end

end

per isakson
on 15 Oct 2019

I wouldn't be surpriced if your solution is faster.

else C(i)>=18; isn't documented either. I was about to write that it's an error, but Matlab doesn't think so. Now, I think this is a legacy from the time when every position on the punch-card was valuable. How do you think it is evaluated?

This

if ismember( C(i), [5:7] )

N(i)=data/188;

elseif ismember( C(i), [8:17] )

N(i)=data/396;

is more readable (and less typing). Or

elseif any( C(i)==[8:17] )

or

elseif C(i)>=8 && C(i)<=17

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.