Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将0映射到1和1映射到-1?_C#_Python_Math_Hlsl - Fatal编程技术网

C# 如何将0映射到1和1映射到-1?

C# 如何将0映射到1和1映射到-1?,c#,python,math,hlsl,C#,Python,Math,Hlsl,我试图将值0转换为1,将值1转换为-1,但不使用if语句。我试着做一些数学运算来将它映射到一个新的范围,但我不能同时对这两个参数进行映射 这可行吗 但它必须在集合中不使用硬编码值的情况下执行此操作,例如: initial = 0 or 1; final_value = (initial + 1) * -1; 因此,最终值将映射为1或-1,具体取决于初始值,使用相同的方程 编辑:我基本上是想摆脱if语句,因为这是着色器代码,我的工作朋友(着色器程序员)说if语句会减慢执行速度,所以最好统一执行。

我试图将值0转换为1,将值1转换为-1,但不使用if语句。我试着做一些数学运算来将它映射到一个新的范围,但我不能同时对这两个参数进行映射

这可行吗

但它必须在集合中不使用硬编码值的情况下执行此操作,例如:

initial = 0 or 1;
final_value = (initial + 1) * -1;
因此,最终值将映射为1或-1,具体取决于初始值,使用相同的方程

编辑:我基本上是想摆脱
if
语句,因为这是着色器代码,我的工作朋友(着色器程序员)说
if
语句会减慢执行速度,所以最好统一执行。不确定它是否有意义。

在Python中:

arr = [1, -1]
mapped = arr[n]
会给你那些价值观。。。但很有可能这不是你想要的。。。因为很难说出你想要什么

既然你已经澄清你想要的速度为着色器,我想我会添加这个信息

In [3]: %timeit x= 1 if not random.randint(0,1) else -1 #if statement
1000000 loops, best of 3: 1.31 us per loop

In [4]: %timeit x= 1-(2*random.randint(0,1)) #simple math
1000000 loops, best of 3: 1.32 us per loop

In [5]: %timeit x= [1,-1][random.randint(0,1)] #array lookup
1000000 loops, best of 3: 1.41 us per loop

In [7]: %timeit x= arr[random.randint(0,1)]
1000000 loops, best of 3: 1.31 us per loop

实际上,我有点惊讶于数组查找速度较慢(实际上只有在尚未构建数组的情况下才会如此)

如果您愿意,可以使用一个简单的字典。你必须说出确切的限制条件。你为什么用两种语言来标记它?您想在这里实现什么?列表或字典都可以让您轻松地将两个整数值映射到其他两个值,但您在细节上没有做太多的描述。还有
[1,-1][variable\u value]
{0:1,1:-1}[variable\u value]
。毫无疑问,前者也将在C#工作。。。。有很多方法可以给这只猫剥皮,但从OP来看,它并不清楚真正的意图是什么(I+1 d Tims答案),微秒是我们isLookups在着色器中可能更慢的。如果可能的话,应该避免任何类型的内存读取(这就是为什么有内置的4+组读取,对许多组的性能影响是巨大的)。真正的问题是HLSL编译器或驱动程序/卡是否会将
if
优化为数学,这可能在这里发生。为了安全起见,我会使用数学。我觉得有趣的是,内联
if
方法是最快的方法之一,因为它被明确地避免了。
In [3]: %timeit x= 1 if not random.randint(0,1) else -1 #if statement
1000000 loops, best of 3: 1.31 us per loop

In [4]: %timeit x= 1-(2*random.randint(0,1)) #simple math
1000000 loops, best of 3: 1.32 us per loop

In [5]: %timeit x= [1,-1][random.randint(0,1)] #array lookup
1000000 loops, best of 3: 1.41 us per loop

In [7]: %timeit x= arr[random.randint(0,1)]
1000000 loops, best of 3: 1.31 us per loop