Matlab numerictype/reinterpretcast equivalent in python?



在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)]) 

我的最终目标是实现三个独立的reinterpertcast语句,即:

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

从Python程序员的角度来看,真正陷入数据类型的杂草与python本身的本质是相反的。 Python是动态类型的,这意味着缺乏效率,但易于编程。为了解决这个问题,许多流行的库都是用 c 编写的,所以你可能想看看像 numpy 这样的库来获得你的打字修复。下面是在 numpy 中设置数据类型的示例。但据我所知,这些仅在预定义的 c 类型上起作用

从理论上讲,你可以定义一个特殊的类来包含你的数据,实现__add____subtract__,以及任何其他必要的关键函数。但是,由于 python 是动态类型的,因此这实际上可能具有有限的回报。

另一个选择可能是Cython,它允许你在python中定义C类型,但如果你只是想要一个快速函数来定义类型,那么Python的底层本质就是与你作斗争。

您可以使用np.dtype.我在以下片段中使用了您对dtype的表示:

import numpy as np
dtype=[('signed', np.bool_), ('word', np.int16), ('frac', np.int16)] 
mytype = np.dtype(dtype)

您可以在如下所示的数组中使用它:

np.array([True,1,1],dtype=mytype)

相关内容

  • 没有找到相关文章

最新更新