例如我有array = [2 2 3 4 5 4 1 5]
并且我想从数组中删除所有不是2的数字,我将如何实现?
我想要一些像XOR但是小数点的东西。 例如:
xor(array,2) = [2 2 0 0 0 0 0 0]
答案 0 :(得分:4)
标准Matlab技巧的简单示例 - 逻辑索引(参见Using Logicals in Array Indexing):
array = [2 2 3 4 5 4 1 5];
array(array != 2) = 0;
isequal(array, [ 2 2 0 0 0 0 0 0])
答案 1 :(得分:0)
不熟悉Octave,所以我不知道lambda是否会起作用,但是这样的话呢?
A = [2 2 3 4 5 4 1 5]
arrayfun(@(x) x == 2, A) // A = [1 1 0 0 0 0 0 0]
arrayfun(@(x) x * 2, A) // A = [2 2 0 0 0 0 0 0]
答案 2 :(得分:0)
@SergV有一个很好的答案,但是当你说从数组中删除时,你是否希望它们像他一样被删除或删除?
从他的回答:
array = [2 2 3 4 5 4 1 5];
array(array != 2) = 0
array =
2 2 0 0 0 0 0 0
但同样地,这将“退出”其他数字:
array = [2 2 3 4 5 4 1 5];
array(array != 2) = []
array =
2 2
另请注意,在任何一种情况下,您都可以使用更复杂的表达式替换(array != 2)
部分。你提到想要这个用于小数。使用==
或!=
可能会遇到浮点精度问题。如果您未精确定义array
的值,则可能需要测试一系列值。例如:
array = [2 2 3 4 5 4 1];
eps
ans = 2.2204e-016
array = array + 10*eps; ##disturb the values to demonstrate the issue
array(array != 2) = 0
array =
0 0 0 0 0 0 0
相反,您需要测试一系列值,并接受可接受的误差范围内的值。
error_range = 1e-9; ##set some arbitrary range to accept
target_value = 2;
array_vals = (array > target_value-error_range)&(array < target_value+error_range)
array_vals =
1 1 0 0 0 0 0
array(~array_vals) = 0
array =
2.00000 2.00000 0.00000 0.00000 0.00000 0.00000 0.00000
最后,请注意,只要值在您要求的数字的eps
范围内,我相信只使用==或〜=即可。即,只需将eps
添加到值中,它仍应使用原始解决方案。