整数数组上的XOR

时间:2015-10-02 04:22:44

标签: octave

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

我想要一些像XOR但是小数点的东西。 例如:

xor(array,2) = [2 2 0 0 0 0 0 0]

3 个答案:

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

相关问题