【发布时间】:2013-06-06 23:05:59
【问题描述】:
我有一个两列六行的矩阵,并想用以下代码构建第二个:
for i=2
if F(:,i)<50
G(:,i) = 1
end
end
但是什么也没发生……
这个想法是,如果 F 中第二列的值小于 50,则 G 中的对应值将是 1。
抱歉,可能是基本问题,但不知道为什么这不起作用。如果我更改来评估 F 值是否~= 50,那么一切正常。
感谢您的帮助。
【问题讨论】:
标签: matlab if-statement
我有一个两列六行的矩阵,并想用以下代码构建第二个:
for i=2
if F(:,i)<50
G(:,i) = 1
end
end
但是什么也没发生……
这个想法是,如果 F 中第二列的值小于 50,则 G 中的对应值将是 1。
抱歉,可能是基本问题,但不知道为什么这不起作用。如果我更改来评估 F 值是否~= 50,那么一切正常。
感谢您的帮助。
【问题讨论】:
标签: matlab if-statement
您的 if 语句只执行一次 - 而不是每个元素执行一次。 F(:,i)<50 返回一个值数组,if 要么是真要么是假;因此,下一行只执行一次(在 G(:,i) 中的所有元素上,或者一个都不执行)。
例如看这段代码:
if(1 < [0 1 2]), disp('true'); end
它不会产生任何输出,即使对于第三个元素也是如此。另一方面,
if(1 < [2 3 4]), disp('true'); end
确实会产生输出...
一般来说,如下:
1 < [0 1 2]
生产
0 0 1
不知道为什么你说它不适用于<,但它确实适用于~=。也许没有等于 50 的元素,所以它只是“似乎”起作用?
一般来说,有一个更好的方法来做你想做的事,只需一行:
G(F(:,2)<50,2)=1
这使用“逻辑索引”,并且比循环快得多。它会考虑F(:,2)的每个元素,并修改G中的对应元素。
最后一条评论:使用变量i 不是很好的做法,因为它有一个内置值sqrt(-1)。如果您在任何地方都有依赖于它具有该值的代码,那么不小心用任何其他值覆盖它会破坏它。这不是您今天的代码的问题,而是为什么要为将来的问题做好准备。
【讨论】: