为什么这个MATLAB';如果';声明不起作用?
我对MATLAB非常陌生,我不明白为什么我的“if”语句和条件不起作用。我有一个100乘4的矩阵(为什么这个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 它不会抛出任何错误,但矩阵不会改变,在我看来,条件是完全合理的。我不知道为什么它不起作用。欢迎任何
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
返回的内容randQ
是一个100×4的数组,表达式randQ(:,4)=1
返回一个100×1的数组,即满(逻辑)0和1:
- 如果此数组的第i个条目是(逻辑)
,则表示1
的条目(i,4)等于randQ
李>1
- 如果此数组的第i个条目是(逻辑)
,则表示0
的条目(i,4)不等于randQ
1
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;