Поскольку MATLAB не имеет описаний типа, присвоение как A = B заменяет тип и содержимое A с типом и содержимое B. Если A не существует во время присвоения, MATLAB создает переменную A и присваивает ее тот же тип и значение как B. Такое присвоение происходит со всеми типами в MATLAB — объектами и встроенными типами одинаково — включая fi, double, single, int8, uint8, int16, и т.д.
Например, следующий код перезаписывает значение и тип int8 A со значением и тип int16 B:
A = int8(0); B = int16(32767); A = B A = 32767 class(A) ans = int16
Можно найти полезным бросить данные в другой тип — например, когда вы бросаете данные от аккумулятора до памяти. Существует несколько способов бросить данные в MATLAB. Следующие разделы обеспечивают примеры трех различных методов:
Кастинг преобразованным в нижний индекс присвоением
Кастинг функцией преобразования
Кастинг с функцией reinterpretcast Fixed-Point Designer™
Кастинг с функцией cast
Следующий преобразованный в нижний индекс оператор присваивания сохраняет тип A и насыщает значение B к int8:
A = int8(0); B = int16(32767); A(:) = B A = 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 s8,0
Для получения дополнительной информации о преобразованных в нижний индекс присвоениях смотрите, что subsasgn функционирует.
Можно преобразовать от одного типа данных до другого при помощи функции преобразования. В этом примере не должен быть предопределен A, потому что это перезаписывается.
B = int16(32767); A = int8(B) A = 127 class(A) ans = int8
То же самое верно для объектов fi:
B = fi(32767, 1, 16, 0)
A = fi(B, 1, 8, 0)
B =
32767
s16,0
A =
127
s8,0Используя Объект numerictype в fi Функции преобразования. Часто определенный numerictype используется во многих местах, и удобно предопределить объекты numerictype для использования в функциях преобразования. Предопределение этих объектов является хорошей практикой, потому что оно также кладет спецификацию типа данных на одно место.
T8 = numerictype(1,8,0)
T8 =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 8
FractionLength: 0
T16 = numerictype(1,16,0)
T16 =
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 0
B = fi(32767,T16)
B =
32767
s16,0
A = fi(B, T8)
A =
127
s8,0Можно преобразовать фиксированную точку и встроенные типы данных, не изменяя базовые данные. Fixed-Point Designer функция reinterpretcast выполняет этот тип преобразования.
В следующем примере B является объектом fi без знака с размером слова 8 битов и дробной длиной 5 битов. Функция reinterpretcast преобразовывает B в объект fi со знаком A с размером слова 8 битов и дробной длиной 1 бита. Реальные значения A и B отличаются, но их бинарные представления являются тем же самым.
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:
binary_B = bin(B) binary_A = bin(A) binary_A = 00011001 00100000 00110010 10000000 binary_B = 00011001 00100000 00110010 10000000
Используя функцию cast, можно преобразовать значение переменной к тому же numerictype, сложности и fimath как другая переменная.
В следующем примере a брошен к типу данных b. Вывод, c, имеет те же свойства numerictype и fimath как b и значение 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Используя этот синтаксис позволяет вам задавать типы данных отдельно от вашего алгоритмического кода, как описано в Ручных Лучшых практиках Преобразования Фиксированной точки.