如何在matlab中使用'if'语句?

How to use the 'if' statement in matlab?

我有一个大小为 5x5 的元胞数组,如下所示

 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 

和两个列向量

 S1= 21 
     23
     28 
     25 
     43 

 S2= 96 
     85 
     78 
     65 
     76 

我想创建一个与 B 大小相同的新元胞数组,比如 5x5,使其满足以下条件

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

所以最终的输出应该是这样的

  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

我尝试使用 if 条件,但出现错误提示 '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

我想我在 if 语句和我正在使用的表达式中犯了一个错误。我哪里错了?请帮忙提前谢谢。

使用==进行比较,=进行赋值。所以if fs{i,j}==00,等等

编辑:Matlab 确实是为高度矢量化的操作而设计的。与本机函数相比,嵌套循环速度较慢,通常可以用矢量化版本替换。您使用元胞数组而不是矩阵有什么特别的原因,尤其是当您只有数字数据时?

如果 B、S1 和 S2 是矩阵,您的代码可以写在一行高效的代码中,运行 会快得多:

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

由于 B 是元胞数组,您需要使用 cell2mat 将其转换为矩阵,除非您想使用 cellfun.

相反,您可以只调用 B_mat = cell2mat(B),然后调用 (B_mat>=10).*repmat(S1,1,5) + (B_mat<10).*repmat(S2,1,5)

您的元胞数组可能实际上包含二进制值,可能表示为字符串,在这种情况下,需要更改上面使用的条件。然后可能需要使用 cellfun