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

时间:2014-11-02 13:56:29

标签: matlab if-statement matrix

我对MATLAB很陌生,我无法弄清楚为什么我的" if"声明和条件不起作用。我有一个100乘4的矩阵(randQ)。列13是随机整数,第4列包含每行1或2。

我想将所有1更改为0并将所有2更改为1&#39 ;在那个100乘4矩阵的4列中。 我正在做的是:

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

它不会抛出任何错误,但矩阵不会改变,在我看来,条件非常有意义。我不知道它为什么不起作用。任何解释都会受到欢迎。

4 个答案:

答案 0 :(得分:6)

声明

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

举个例子,

if [1, 1, 1] == 1
    disp("True")
end

将显示"True"。请参阅下面的解释。


你写

  

我无法弄清楚为什么我的“if”陈述和条件不起作用

发生的事实上非常微妙。你需要了解几件事情:

  1. 表达式randQ(:,4) == 1返回的内容,
  2. 当出现谓词时,“if”语句是什么,不是标量,而是数组,
  3. randQ(:,4) = 0做什么。
  4. 此外,您需要开始使用logical indexing进行此类操作。

    randQ(:,4) == 1返回

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

    • 如果此数组的第i个条目是(逻辑)1,则表示randQ的条目(i,4)等于1;
    • 如果此数组的第i个条目是(逻辑)0,则表示randQ的条目(i,4)等于{{1 }}。

    数组作为谓词

    现在您知道您正在使用数组作为“if”语句的谓词,让我们看看会发生什么。如果“if”语句的谓词是一个数组,只有当该数组的所有条目都评估为逻辑1 时,MATLAB才会执行“if”分支

    例如,

    1

    将显示if [1, 2; 3, 4] disp("True") else disp("False") end ,因为"True"的所有条目都会被转换为逻辑[1,2;3,4],这会导致谓词被评估为逻辑1(true)。然而,

    1

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

    无论如何,你的作业陈述都是错误的

    转让声明

    if

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

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

    你写

      

    我希望在100 x 4矩阵的第4列中将所有1变为0,将所有2变为1。

    更加惯用的方法as pointed out by giuseppe,是使用logical indexing

    0

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

答案 1 :(得分:0)

你问你的矢量== 1是不是这样。

还有更多方法可以做到,但你可以使用for循环每个值。

答案 2 :(得分:0)

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 th 列将获得值1:

>M(:,2)=0
M =

   1   0
   2   0
   3   0

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

答案 3 :(得分:0)

正如其他人所回答的那样,你试图将矢量与标量进行比较,这种情况永远不会成真。

相反,您可以使用函数查找来实现您的目标,此函数实际上实现了元素比较。

randQ(find(randQ(:,4) == 1),4) = 0;
randQ(find(randQ(:,4) == 2),4) = 1;