整数数组异或

XOR on integer array

例如我有 array = [2 2 3 4 5 4 1 5] 并且我想从数组中删除所有不是 2 的数字,我该如何实现?

我想要 XOR 之类的东西,但用于小数。 例如:

xor(array,2) = [2 2 0 0 0 0 0 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]

标准 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])

@SergV 有一个很好的答案,但是当你说从数组中删除时,你希望它们像他那样被归零,还是被删除?

来自他的回答:

array = [2   2   3   4   5   4   1   5];
array(array != 2) = 0
array =
2   2   0   0   0   0   0   0

但同样,这将 'drop out' 其他数字:

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 添加到值中,它应该仍然可以使用原始解决方案。