我对MATLAB很陌生,我无法弄清楚为什么我的" if"声明和条件不起作用。我有一个100乘4的矩阵(randQ
)。列1
到3
是随机整数,第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
它不会抛出任何错误,但矩阵不会改变,在我看来,条件非常有意义。我不知道它为什么不起作用。任何解释都会受到欢迎。
答案 0 :(得分:6)
其他一些答案包含不正确/不准确的声明:
举个例子,
if [1, 1, 1] == 1
disp("True")
end
将显示"True"
。请参阅下面的解释。
你写
我无法弄清楚为什么我的“if”陈述和条件不起作用
发生的事实上非常微妙。你需要了解几件事情:
randQ(:,4) == 1
返回的内容,randQ(:,4) = 0
做什么。此外,您需要开始使用logical indexing进行此类操作。
randQ(:,4) == 1
返回假设randQ
是一个100乘4的数组,表达式randQ(:,4) == 1
返回100乘1 logical array,即满(逻辑)0和1 :
1
,则表示randQ
的条目(i,4)等于1
; 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;