- 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

# How to perform operations depending on a value in an array

15 views (last 30 days)

Show older comments

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

##### 0 Comments

### Accepted Answer

per isakson
on 15 Oct 2019

Edited: per isakson
on 16 Oct 2019

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

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'

##### 2 Comments

per isakson
on 15 Oct 2019

Edited: per isakson
on 16 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

### More Answers (0)

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!