在Matlab中,有一个命令可以定义一个新的数字类型,例如:
如果有更简单的方法,我很乐意用不同的方式完成。
以下是我在评论中添加的信息的转录:mathworks.com/help/fixedpoint/ref/reinterpretcast.html 这是来自Matlab的reinterpretcast的文档。实际上,您传入一个整数或定点数,该函数将会移动小数点周围。这使得即使二进制数据没有改变,变量的数值也不同。
偶尔,您可以通过普通除法在某些数字范围内实现类似的效果,但这并不是可靠的解决方案,也不是理想的解决方案。
我可能可以自己写一些东西来做到这一点,但我希望比我聪明的人已经做过了。考虑到大多数Matlab功能都包含在numpy中,我认为这也应该是如此。结构化数组可能是一个不错的选择,但我不确定转换成它们的工作方式。
编辑:
我现在意识到我真的只想关注一个单一的命令,如果有人告诉我如何做到与此转换完全等价的事情,我将非常高兴,因为我仍然无法弄清楚它。速度不是问题,它只需要运行即可。
这是命令:
我尝试了类似这样的东西,但它不起作用,但可能正在正确的轨道上,我看起来比MatLab中发生的要少一些比例因子,但不是每次都是相同的比例因子。
numerictype(0,16,8)
请查看文档:https://www.mathworks.com/help/fixedpoint/ref/embedded.numerictype.html
NumPy或其他库中是否有等价物?我能否使用类似的命令创建自己的dtype?
编辑:
由于被要求提供更多信息,这里有一个关于matlab中固定点数值类型如何工作的参考资料:https://www.mathworks.com/help/dsp/ug/concepts-and-terminology.html 基本上,您设置有符号/无符号属性,然后设置一个字的长度和小数位数。因此,例如在我给出的示例中,您将拥有一个带有16字长和10分数长度的有符号数。
从我阅读的关于结构化数组的文章中,似乎类似表示可能是以下内容之一:
dtype=[('signed', np.bool_), ('word', np.int16), ('frac', np.int16)])
我的终极目标是实现三个不同的重新解释转换语句,分别为:
reinterpretcast(EVMacq,numerictype(0,16,8))
reinterpretcast(Payload16c,numerictype(1,16,16))
reinterpretcast(Payload32,numerictype(1,32,32))
如果有更简单的方法,我很乐意用不同的方式完成。
以下是我在评论中添加的信息的转录:mathworks.com/help/fixedpoint/ref/reinterpretcast.html 这是来自Matlab的reinterpretcast的文档。实际上,您传入一个整数或定点数,该函数将会移动小数点周围。这使得即使二进制数据没有改变,变量的数值也不同。
偶尔,您可以通过普通除法在某些数字范围内实现类似的效果,但这并不是可靠的解决方案,也不是理想的解决方案。
我可能可以自己写一些东西来做到这一点,但我希望比我聪明的人已经做过了。考虑到大多数Matlab功能都包含在numpy中,我认为这也应该是如此。结构化数组可能是一个不错的选择,但我不确定转换成它们的工作方式。
编辑:
我现在意识到我真的只想关注一个单一的命令,如果有人告诉我如何做到与此转换完全等价的事情,我将非常高兴,因为我仍然无法弄清楚它。速度不是问题,它只需要运行即可。
这是命令:
reinterpretcast(Payload16c,numerictype(1,16,16))
其中Payload16c是由np.complex(real,imag)
定义的复数数组。提前感谢您。我尝试了类似这样的东西,但它不起作用,但可能正在正确的轨道上,我看起来比MatLab中发生的要少一些比例因子,但不是每次都是相同的比例因子。
i = 0
result = []
#first generate a binary number that is a one in the highest spot and zero elsewhere
comp = 2**wordlength
#next iterate through entire array
while i < array.size:
#check to see if the value of the item is near the largest value it can be
#if so its likely that it is just negative and thats why that bit is high
if(array[i:i+1] < ((2**fracbits)-1000)):
#if it is not near the largest number simply convert divide to move decimal place
real = array[i:i+1] * (2**-fracbits)
else:
#else we subtract comp so that we get the negative number this binary string was supposed to represent.
# print(np.binary_repr(np.uint16(array[i:i+1])))
real = double(array[i:i+1]) - comp
#then we divide it to move the decimal point properly
real = real * (2**-fracbits)
#same for the next number in the array which is the imaginary component
if(array[i+1:i+2] < ((2**fracbits)-2000)):
imag = array[i+1:i+2] * (2**-fracbits)
else:
imag = double(array[i+1:i+2]) - comp
imag = imag * (2**-fracbits)
result.append(np.complex(real,imag))
i+=2
return result
reinterpretcast(...)
并没有告诉我们您需要什么,除非我们特别熟悉Fixed Point工具箱,而我们大多数人(尤其是Python用户)并不熟悉。您想要实现什么功能?hpaulj建议的结构化数组是否涵盖了您的需求? - Andras Deak -- Слава Україніc
数值类型 - int,float,double。它们的使用被编译代码所固定。用户定义的dtypes
不太可能具有类似的性能 - 除非他们重写并重新编译numpy
。复合dtypes
对于从文件加载混合数据很方便,但不允许您跨字段进行计算。如果需要特殊结构和良好的速度,则自定义 “c” 代码加上 “cython” 粘合剂可能是最佳选择。 - hpauljndarray
的最后一个维度,然后您可以将该最后维度视为一个单位,并且可以在其中拥有所需数量的整数。 - RichieV