MATLAB Answers

0

How to perform operations depending on a value in an array

Asked by Pilar Jiménez on 15 Oct 2019
Latest activity Edited by per isakson
on 16 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

  0 Comments

Sign in to comment.

1 Answer

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'

  2 Comments

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
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.