整数数组异或
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
添加到值中,它应该仍然可以使用原始解决方案。
例如我有 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
添加到值中,它应该仍然可以使用原始解决方案。