免责声明
其他一些答案包含不正确/不准确的声明:
举个例子,
if [1, 1, 1] == 1
disp("True")
end
将显示"True"。请参阅下面的说明。
你写
我不明白为什么我的“if”语句和条件不起作用
发生的事情实际上非常微妙。您需要了解几件事:
-
randQ(:,4) == 1 的表达式返回什么,
- “if”语句在呈现谓词(不是标量,而是数组)时的作用,
-
randQ(:,4) = 0 做了什么。
此外,您需要开始使用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”语句的谓词是一个数组,MATLAB 将执行“if”分支只有当该数组的所有条目的计算结果都为逻辑 1。
例如,
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。
对此,as pointed out by giuseppe 更惯用的方法是使用 logical indexing:
randQ(randQ(:,4) == 1, 4) = 0;
randQ(randQ(:,4) == 2, 4) = 1;
不过,不需要使用find 函数,因为randQ(:,4) == 1 已经返回您想要的:一个100×1 逻辑数组,指示randQ 的第4 列的哪些条目等于1 .