为什么这个MATLAB';如果';声明不起作用?

为什么这个MATLAB';如果';声明不起作用?,matlab,if-statement,matrix,Matlab,If Statement,Matrix,我对MATLAB非常陌生,我不明白为什么我的“if”语句和条件不起作用。我有一个100乘4的矩阵(randQ)。列1到3是随机整数,列4每行包含1或2 我想将该100×4矩阵中列4中的所有1更改为0,所有2更改为1。 我正在做的是: if randQ(:,4) == 1 randQ(:,4) = 0 elseif randQ(:,4) ==2 randQ(:,4) = 1 end 它不会抛出任何错误,但矩阵不会改变,在我看来,条件是完全合理的。我不知道为什么它不起作用。欢迎任何

我对MATLAB非常陌生,我不明白为什么我的“if”语句和条件不起作用。我有一个100乘4的矩阵(
randQ
)。列
1
3
是随机整数,列4每行包含1或2

我想将该100×4矩阵中列
4
中的所有
1
更改为
0
,所有
2
更改为
1
。 我正在做的是:

if randQ(:,4) == 1
    randQ(:,4) = 0
elseif randQ(:,4) ==2
    randQ(:,4) = 1
end

它不会抛出任何错误,但矩阵不会改变,在我看来,条件是完全合理的。我不知道为什么它不起作用。欢迎任何解释。

您询问的是向量==1,而事实并非如此

有更多的方法可以做到这一点,但您可以使用for循环每个值。

randQ(:,4)的结果是一个长度为100的向量。然后尝试将其与标量进行比较,只有当向量(或矩阵)的所有成员都等于标量时,这才是真的

> M=[1 1; 2 1; 3 2]
M =                                            

   1   1
   2   2
   3   1

> M(:,1)
ans =

   1
   2
   3
此外,您尝试更改值的方式不正确,如果您执行
randQ(:,4)=1
,则整个第4列将得到值1:

>M(:,2)=0
M =

   1   0
   2   0
   3   0
实现所需的最简单方法是在循环中逐行迭代矩阵,检查值,然后更改它。

免责声明 其他一些答案包含不正确/不准确的声明:

例如,

if [1, 1, 1] == 1
    disp("True")
end
将显示
“True”
。请参见下面的解释


你写

我不明白为什么我的“如果”陈述和条件不起作用

发生的事情实际上是相当微妙的。您需要了解以下几点:

  • 表达式
    randQ(:,4)==1
    返回的内容
  • 当使用不是标量而是数组的谓词时,“if”语句的作用
  • randQ(:,4)=0所做的事
  • 此外,您需要开始为此类操作使用

    randQ(:,4)=1返回什么 假设
    randQ
    是一个100×4的数组,表达式
    randQ(:,4)=1
    返回一个100×1的数组,即满(逻辑)0和1:

    • 如果此数组的第i个条目是(逻辑)
      1
      ,则表示
      randQ
      的条目(i,4)等于
      1
    • 如果此数组的第i个条目是(逻辑)
      0
      ,则表示
      randQ
      的条目(i,4)不等于
      1
    数组作为谓词 既然您知道您正在使用数组作为“if”语句的谓词,那么让我们看看会发生什么。如果“If”语句的谓词是一个数组,则只有当该数组的所有项计算为逻辑
    1
    时,MATLAB才会执行“If”分支

    比如说,

    if [1, 2; 3, 4]
        disp("True")
    else
       disp("False")
    end
    
    将显示
    “True”
    ,因为
    [1,2;3,4]
    的所有条目都被转换为逻辑
    1
    ,这将导致谓词被计算为逻辑
    1
    (True)。但是,

    if [1, 2; 3, 0]
        disp("True")
    else
       disp("False")
    end
    
    将显示
    “False”
    ,因为
    [1,2;3,0]
    的条目(2,2)被强制转换为逻辑
    0
    ,这将导致谓词计算为逻辑
    0
    (False)。因此,如果
    randQ(:,4)
    中至少有一个条目为零,则不会执行
    if

    你的作业陈述无论如何都是不正确的 赋值语句

    randQ(:,4) = 0
    
    将用
    0
    覆盖第4列中的所有条目,这不是您想要的

    更好的方法:使用逻辑索引 你写

    我想把100×4矩阵第4列中的所有1都改为0,所有2都改为1

    更惯用的方法是使用:


    但是,不需要使用
    find
    函数,因为
    randQ(:,4)==1
    已经返回您想要的:一个100×1的逻辑数组,指示
    randQ
    第4列的哪些条目等于
    1

    您询问的向量是否==1,但事实并非如此。尝试
    如果[1,1]==1,disp(“True”),end
    @Jubobs:No,Luc是对的。根据问题中的描述,
    all(randQ(:,4)==1)
    不是真的,因为坏掉的代码在这种情况下确实有效。@BenVoigt我只想指出,
    =
    可以计算为逻辑
    1
    ,在这种情况下,它与
    的维度无关。然后,您试图将它与标量进行比较,这永远不会是真的。如果[1,1]==1,disp(“True”),请尝试
    ,结束
    。谢谢!这是一个很好的解释。我将它回滚到您的正确版本
    randQ(:,4)==1
    返回一个逻辑数组<代码>查找
    返回索引列表。不一样的东西,但是当用于索引时,两者都给出了相同的结果。@BenVoigt感谢
    :s
    所有这些编辑,最后我把自己弄糊涂了。
    randQ(randQ(:,4) == 1, 4) = 0;
    randQ(randQ(:,4) == 2, 4) = 1;