fi オブジェクトのキャスト
代入による上書き
MATLAB® ソフトウェアは型宣言がないため、A = B のような代入によって A の型と内容が B の型と内容によって置き換えられます。代入時に A がない場合は、MATLAB が変数 A を作成し、B と同じ型と値を代入します。このような代入は、fi、double、single、int8、uint8、int16 など、オブジェクトと組み込みの型も含む MATLAB のすべての型で発生します。
たとえば、次のコードは A の値と int8 型を B の値と int16 型で上書きします。
A = int8(0); B = int16(32767); A = B
A = int16 32767
class(A)
ans =
'int16'MATLAB ソフトウェアでキャストする方法
たとえば、アキュムレータのデータをメモリにキャストする場合に、データを別の型にキャストすると便利です。MATLAB でデータをキャストする方法はいくつかあります。以下の節では、以下の 4 つの方法の例を示します。
添字を使用した代入によるキャスト
変換関数によるキャスト
Fixed-Point Designer™ の関数
reinterpretcastによるキャスト関数
castによるキャスト
添字を使用した代入によるキャスト
次の添字を使用した代入ステートメントは A の型を維持し、B の値を int8 に飽和します。
A = int8(0); B = int16(32767); A(:) = B
A = int8 127
class(A)
ans =
'int8'fi オブジェクトについても同様です。
fipref('NumericTypeDisplay', 'short'); A = fi(0, 1, 8, 0); B = fi(32767, 1, 16, 0); A(:) = B
A =
127
numerictype(1,8,0)メモ
添字を使用した代入の詳細は、関数 subsasgn の説明を参照してください。
変換関数によるキャスト
変換関数を使用すると、データ型を変換できます。この例では、A は上書きされるので事前に定義する必要がありません。
B = int16(32767); A = int8(B)
A = int8 127
class(A)
ans =
'int8'fi オブジェクトについても同様です。
B = fi(32767,1,16,0) A = fi(B,1,8,0)
B =
32767
numerictype(1,16,0)
A =
127
numerictype(1,8,0)fi 変換関数での numerictype オブジェクトの使用
通常は、特定の numerictype が多くの場所で使用されるので、変換関数で使用する numerictype オブジェクトを事前に定義しておくと便利です。これらのオブジェクトの事前定義は、データ型の指定を 1 か所に置くという点でもよい方法です。
T8 = numerictype(1,8,0) T16 = numerictype(1,16,0)
T8 =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 8
FractionLength: 0
T16 =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 0B = fi(32767,T16) A = fi(B,T8)
B =
32767
numerictype(1,16,0)
A =
127
numerictype(1,8,0)関数 reinterpretcast によるキャスト
固定小数点データ型と組み込みデータ型は、基になるデータを変更せずに変換できます。Fixed-Point Designer の関数 reinterpretcast はこのような変換を実行します。
次の例で、B は、語長が 8 ビット、小数部の長さが 5 ビットの符号なし fi オブジェクトです。関数 reinterpretcast は B を、語長が 8 ビット、小数部の長さが 1 ビットの符号付き fi オブジェクト A に変換します。A と B の実際値は異なりますが、2 進数表現は同じです。
B = fi([pi/4 1 pi/2 4],0,8,5) T = numerictype(1,8,1); A = reinterpretcast(B,T)
B =
0.7813 1.0000 1.5625 4.0000
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 8
FractionLength: 5
A =
12.5000 16.0000 25.0000 -64.0000
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 8
FractionLength: 1基になるデータが変更されていないことを確認するには、A と B の 2 進数表現を比較します。
binary_B = bin(B) binary_A = bin(A)
binary_B =
'00011001 00100000 00110010 10000000'
binary_A =
'00011001 00100000 00110010 10000000'関数 cast によるキャスト
関数 cast を使用して、変数の値を別の変数と同じ numerictype、実数/複素数および fimath に変換できます。
次の例では、a が b のデータ型にキャストされています。出力 c は b と同じ numerictype と fimath プロパティをもち、また a と同じ値をもちます。
a = pi; b = fi([],1,16,13,'RoundingMethod','Floor'); c = cast(a,'like',b)
c =
3.1415
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 13
RoundingMethod: Floor
OverflowAction: Saturate
ProductMode: FullPrecision
SumMode: FullPrecisionこの構文を使用することで、手動による固定小数点の変換のベスト プラクティスで説明されているように、データ型をアルゴリズム コードとは別に指定できます。
参考
cast | fi | numerictype | reinterpretcast | subsasgn