2

typecastR中的Matlab函数的等价物是什么?在 Python 中?在朱莉娅?Matlab的typecast函数的描述在这里给出:typecast

示例,在 Matlab 中

X = uint32([1 255 256])
X =
           1         255         256

Y = typecast(X, 'uint8') # little endian
Y =
   1   0   0   0  255   0   0   0   0   1   0   0

谢谢

请注意:我不是在寻找与 Matlabcast函数等效的 R / Python / Julia(例如,我不是在寻找as.integer,as.character在 R 中)

编辑:

感谢 Julia / R / Python 的回答。StackOverflow 允许我选择一个答案,但我对所有答案都投了赞成票。

4

3 回答 3

11

在 Julia 中,您正在寻找reinterpret

julia> X = Uint32[1,255,256]
3-element Array{Uint32,1}:
 0x00000001
 0x000000ff
 0x00000100

julia> Y = reinterpret(Uint8,X)
12-element Array{Uint8,1}:
 0x01
 0x00
 0x00
 0x00
 0xff
 0x00
 0x00
 0x00
 0x00
 0x01
 0x00
 0x00

但是请注意,对于矩阵,即使第一个维度是单例,您也需要指定结果维度(因为您需要 4x3 还是 1x12 数组是不明确的):

julia> X = Uint32[1 255 256]
1x3 Array{Uint32,2}:
 0x00000001  0x000000ff  0x00000100

julia> Y = reinterpret(Uint8,X) # This won't work
ERROR: result shape not specified

julia> Y = reinterpret(Uint8,X,(1,12))
1x12 Array{Uint8,2}:
 0x01  0x00  0x00  0x00  0xff  0x00  0x00  0x00  0x00  0x01  0x00  0x00
于 2014-01-05T09:52:25.580 回答
7

在 R 中,您可以将对象写入原始二进制连接并取回字节向量。这将使您获得与uint8输出示例等效的内容:

> X=c(1,255,256)
> mode(X)
[1] "numeric"

这里重要的是存储模式,而不是模式。所以我们将它设置为整数——相当于 uint32,即每个整数 4 个字节:

> storage.mode(X)
[1] "double"
> storage.mode(X)="integer"

现在我们可以使用writeBin. 第二个参数是一个任意的原始向量,因此我们创建一个长度为零的临时向量。我们只关心返回值:

> Xraw = writeBin(X,raw(0))
> Xraw
 [1] 01 00 00 00 ff 00 00 00 00 01 00 00

使用相反的方法readBin

> readBin(Xraw,"int",n=3)
[1]   1 255 256

将前 8 个字节解压成双精度:

> Xdoub = readBin(Xraw,"double",n=1)
> Xdoub
[1] 5.411089e-312

显然是一个无意义的值。但是让我们检查它的前 8 个字节:

> writeBin(Xdoub,raw(0))
[1] 01 00 00 00 ff 00 00 00

R 并不真正具有所有 C 级别的类型,因此如果您需要任何东西,您可以从原始字节构建它或编写一些 C 代码来链接 R 函数。

于 2014-01-05T09:28:14.063 回答
6

Python/Numpy:

>>> import numpy as np
>>> x = np.array([1,255,256], dtype=np.int32)
>>> y = x.view(np.uint8)

(您可以类似地更改x自身的类型:) x.dtype = np.uint8

输出:

>>> x
array([  1, 255, 256])
>>> y
array([  1,   0,   0,   0, 255,   0,   0,   0,   0,   1,   0,   0], dtype=uint8)

请注意,这y是一个就地重新解释的视图x因此任何更改y都将反映在x

>>> y[:] = 255
>>> x
array([-1, -1, -1])

MATLAB

这是等效的 MATLAB 输出:

>> x = int32([1,2,3])
x =
           1           2           3
>> y = typecast(x, 'uint8')
y =
    1    0    0    0    2    0    0    0    3    0    0    0

>> y(:) = 255
y =
  255  255  255  255  255  255  255  255  255  255  255  255
>> xx = typecast(y, 'int32')
xx =
          -1          -1          -1

如果您想在 MATLAB 中不创建深层副本进行类型转换,请参阅typecastxMEX-function(它使用未记录的功能来创建共享数据副本)。


请注意 MATLAB 使用饱和算法,unlinke Python 具有模块化算法

Python/Numpy

# wraps around the other end
>>> np.array(257, dtype=np.uint8)
array(1, dtype=uint8)

MATLAB

% saturates at the maximum
>> uint8(257)
ans =
  255
于 2014-01-05T12:49:25.077 回答