2

typecastRでのMatlabの機能に相当するものは何ですか? パイソンで?ジュリアで?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

ありがとう

注意してください:私はMatlabのcast機能に相当するR / Python / Juliaを探していません(たとえば、Rでは探していませas.integeras.character

編集:

Julia / R / Pythonの回答ありがとうございます。StackOverflow では 1 つの回答を選択できますが、すべての回答に賛成票を投じました。

4

3 に答える 3

11

Juliaでは、再解釈を探しています:

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ました。2 番目の引数は任意の生のベクトルなので、長さゼロのアドホックを 1 つ作成します。戻り値のみを気にします。

> 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 バイトを double にアンパックします。

> 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

パイソン/ナンピー:

>>> 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 関数 (ドキュメント化されていない機能を使用して共有データ コピーを作成する) を参照してください。


MATLAB は飽和演算を使用することに注意してください。モジュール演算を持つ Python のリンクを解除します。

パイソン/ナンピー

# 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 に答える