Abirami Anbalagan
Abirami Anbalagan

Reputation: 196

How to use the 'if' statement in matlab?

I have a cell array of size 5x5 as below

 B= 00 10 11 10 11 
    01 01 01 01 11 
    10 00 01 00 01 
    10 10 01 01 11 
    10 10 10 00 10 

And two column vectors

 S1= 21 
     23
     28 
     25 
     43 

 S2= 96 
     85 
     78 
     65 
     76 

I want to create a new cell array of the same size as B say 5x5 such that it satisfies the following condition

  Final={S1 if B{i}=11
         S1 if B{i}=10
         S2 if B{i}=01
         S2 if B{i}=00

So the resulting output would be something like this

  Z = s2 s1 s1 s1 s1   
      s2 s2 s2 s2 s1
      s1 s2 s2 s2 s2
      s1 s1 s2 s2 s1
      s1 s1 s1 s2 s1
ie Z= 96 21 21 21 21 
      85 85 85 85 23 
      28 78 78 78 78
      25 25 65 65 25
      43 43 43 76 43

I tried using the if condition but i get error saying 'Error: The expression to the left of the equals sign is not a valid target for an assignment.'

 for i=1:1:128
   for j=1:1:16
      if fs{i,j}=00
         Z{i,j}=S1{i,j}
      elseif fs{i,j}= 01
         Z{i,j}=S2{i,j}
      elseif fs{i,j}= 10
         Z{i,j}=S1{i,j}
      elseif fs{i,j}= 11
         Z{i,j}=S2{i,j}
        end
     end

I think I'm making a mistake in the if statement as well as the expressions I'm using. Where am i going wrong? Please help thanks in advance.

Upvotes: 0

Views: 178

Answers (2)

Falimond
Falimond

Reputation: 608

Since B is a cell array you will want to convert it to a matrix using cell2mat unless you'd like to use cellfun.

Instead, you can just call B_mat = cell2mat(B), followed by (B_mat>=10).*repmat(S1,1,5) + (B_mat<10).*repmat(S2,1,5).

It's possible that your cell array actually contains binary values, possibly represented as strings, in which case the conditions used above would need to be changed. Then using cellfun may be necessary.

Upvotes: 1

weiyin
weiyin

Reputation: 6979

Use == for comparison and = for assignment. So if fs{i,j}==00, etc.

Edit: Matlab is really designed for highly vectorized operations. Nested loops are slow compared to native functions, and typically can be replaced with vectorized versions. Is there any particular reason why you are using cell arrays instead of matrices, especially when you only have numeric data?

If B, S1, and S2 were matrices your code could be written in one highly efficient line that will run much much faster:

Z = bsxfun(@times, S1, B == 11 | B == 10) + bsxfun(@times, S2, B == 01 | B == 0)

Upvotes: 5

Related Questions