数值类型(二)"/>
Matlab中数值类型(二)
目录
单精度运算
创建双精度数据
转换为单精度
创建单精度零和一
算术运算和线性代数运算
用于处理单精度或双精度的一个程序
整数
整数类
创建整数数据
整数类的算术运算
整数类的最大值和最小值
整数运算
加载整数信号数据
对数据绘图
处理数据
加载整数图像数据
显示图像
缩放图像
添加图像
单精度运算
如何对单精度数据执行算术运算和线性代数运算。此外,还说明了如何根据输入相应地按单精度或双精度计算结果。
创建双精度数据
首先创建一些数据,默认情况下为双精度。
Ad = [1 2 0; 2 5 -1; 4 10 -1]Ad = 3×31 2 02 5 -14 10 -1
转换为单精度
可以使用single
函数将数据转换为单精度。
A = single(Ad); % or A = cast(Ad,'single');
创建单精度零和一
此外,也可以分别使用函数创建单精度零和一。
n = 1000;
Z = zeros(n,1,'single');
O = ones(n,1,'single');
看一下工作区中的变量。
whos A Ad O Z nName Size Bytes Class AttributesA 3x3 36 single Ad 3x3 72 double O 1000x1 4000 single Z 1000x1 4000 single n 1x1 8 double
可以看到,部分变量的类型为single
,变量A
(Ad
的单精度版本)需要一半的内存字节数用于存储,因为单精度仅需要四字节(32 位),而双精度需要 8 字节(64 位)。
算术运算和线性代数运算
可以对单精度数据执行标准算术运算和线性代数运算。
B = A' % Matrix TransposeB = 3x3 single matrix1 2 42 5 100 -1 -1whos BName Size Bytes Class AttributesB 3x3 36 single
可以看出,此操作的结果 B
为单精度。
C = A * B % Matrix multiplication
C = 3x3 single matrix5 12 2412 30 5924 59 117C = A .* B % Elementwise arithmetic
C = 3x3 single matrix1 4 04 25 -100 -10 1X = inv(A) % Matrix inverse
X = 3x3 single matrix5 2 -2-2 -1 10 -2 1I = inv(A) * A % Confirm result is identity matrix
I = 3x3 single matrix1 0 00 1 00 0 1I = A \ A % Better way to do matrix division than inv
I = 3x3 single matrix1 0 00 1 00 0 1E = eig(A) % Eigenvalues
E = 3x1 single column vector3.73210.26791.0000F = fft(A(:,1)) % FFT
F = 3x1 single column vector7.0000 + 0.0000i-2.0000 + 1.7321i-2.0000 - 1.7321iS = svd(A) % Singular value decomposition
S = 3x1 single column vector12.31710.51490.1577P = round(poly(A)) % The characteristic polynomial of a matrix
P = 1x4 single row vector1 -5 5 -1R = roots(P) % Roots of a polynomial
R = 3x1 single column vector3.73211.00000.2679Q = conv(P,P) % Convolve two vectors
Q = 1x7 single row vector1 -10 35 -52 35 -10 1R = conv(P,Q)
R = 1x10 single row vector1 -15 90 -278 480 -480 278 -90 15 -1
用于处理单精度或双精度的一个程序
现在来看一个函数,该函数用于计算为使比率小于 single 或 double 数据类型的正确机器精度 (eps
),斐波那契数列需要的足够项数。
% How many terms needed to get single precision results?
fibodemo('single')ans = 19
% How many terms needed to get double precision results?
fibodemo('double')ans = 41
% Now let's look at the working code.
type fibodemofunction nterms = fibodemo(dtype)
%FIBODEMO Used by SINGLEMATH demo.
% Calculate number of terms in Fibonacci sequence.% Copyright 1984-2014 The MathWorks, Inc.fcurrent = ones(dtype);
fnext = fcurrent;
goldenMean = (ones(dtype)+sqrt(5))/2;
tol = eps(goldenMean);
nterms = 2;
while abs(fnext/fcurrent - goldenMean) >= tolnterms = nterms + 1;temp = fnext;fnext = fnext + fcurrent;fcurrent = temp;
end
请注意,我们初始化了几个变量,即 fcurrent
、fnext
和 goldenMean
,初始化所用的值取决于输入数据类型,容差 tol
也取决于该类型。与等效的双精度计算相比,单精度要求计算的项较少。
整数
整数类
MATLAB® 具有四个有符号整数类和四个无符号整数类。有符号类型使您能够处理负整数以及正整数,但表示的数字范围不如无符号类型广泛,因为有一个位用于指定数字的正号或负号。无符号类型提供了更广泛的数字范围,但这些数字只能为零或正数。MATLAB 支持以 1 字节、2 字节、4 字节和 8 字节几种形式存储整数数据。如果使用可容纳数据的最小整数类型来存储数据,则可以节省程序内存和执行时间。例如,不需要使用 32 位整数来存储值 100
。下面列出了八个整数类、使用每种类型可存储的值范围以及创建该类型所需的 MATLAB 转换函数:
类 | 值的范围 | 转换函数 |
---|---|---|
有符号 8 位整数 | -2^7 到 2^7-1 |
|
有符号 16 位整数 | -2^15 到 2^15-1 |
|
有符号 32 位整数 | -2^31 到 2^31-1 |
|
有符号 64 位整数 | -2^63 到 2^63-1 |
|
无符号 8 位整数 | 0 到 2^8-1 |
|
无符号 16 位整数 | 0 到 2^16-1 |
|
无符号 32 位整数 | 0 到 2^32-1 |
|
无符号 64 位整数 | 0 到 2^64-1 |
|
创建整数数据
MATLAB 默认情况下以双精度浮点形式 (double
) 存储数值数据。要以整数形式存储数据,需要从double
转换为所需的整数类型。使用上表中所示的转换函数之一。
例如,如果要以16位有符号整数形式存储赋给变量x的值 325
,请键入
x = int16(325);
如果要转换为整数的数值带有小数部分,MATLAB 将舍入到最接近的整数。如果小数部分正好是 0.5
,则 MATLAB 会从两个同样临近的整数中选择绝对值大小更大的整数:
x = 325.499;
int16(x)
ans =int16325 x = x + .001;
int16(x)
ans =int16326
如果需要使用非默认舍入方案对数值进行舍入,MATLAB 提供了以下四种舍入函数:round、fix、floor和ceil。fix
函数能够覆盖默认的舍入方案,并朝零舍入(如果存在非零的小数部分):
x = 325.9;int16(fix(x))
ans =int16325
同时涉及整数和浮点数的算术运算始终生成整数数据类型。MATLAB 会在必要时根据默认的舍入算法对结果进行舍入。以下示例生成1426.75
的确切答案,然后MATLAB将该数值舍入到下一个最高的整数:
int16(325) * 4.39
ans =int161427
在将其他类(例如字符串)转换为整数时,这些整数转换函数也很有用:
str = 'Hello World';int8(str)
ans =1×11 int8 row vector72 101 108 108 111 32 87 111 114 108 100
如果将NaN
值转换为整数类,则结果为该整数类中的 0
值。例如,
int32(NaN)
ans =int320
整数类的算术运算
MATLAB 可以对以下类型的数据执行整数算术运算:
- 整数或具有相同整数数据类型的整数数组。此运算生成的结果与操作数具有相同的数据类型:
x = uint32([132 347 528]) .* uint32(75);
class(x)
ans =uint32
- 整数或整数数组以及双精度标量浮点数。此运算生成的结果与整数操作数具有相同的数据类型:
x = uint32([132 347 528]) .* 75.49;
class(x)
ans =uint32
对于一个操作数为整数数据类型(64 位整数除外)的数组,另一个操作数为双精度标量的所有二进制运算,MATLAB 会使用按元素双精度算法来执行运算,然后将结果重新转换为原始的整数数据类型。对于涉及 64 位整数数组和双精度标量的二进制运算,MATLAB 会使用扩展精度(比如 80 位扩展精度)算法来执行运算,以防止精度损失。不支持涉及具有整数类型的复数的运算。
整数类的最大值和最小值
每种整数数据类型都存在可以用该类型表示的最大数和最小数。整数中显示的表在“值的范围”一列中列出了每种整数数据类型的最大值和最小值。
可以通过 intmax
和 intmin
函数获取这些值:
intmax('int8')
ans =int8127intmin('int8')
ans =int8-128
如果将大于某个整数数据类型的最大值的数值转换为该类型,MATLAB会将其设置为最大值。同样,如果转换小于该整数数据类型的最小值的数值,MATLAB会将其设置为最小值。例如,
x = int8(300)
x =int8127x = int8(-300)
x =int8-128
此外,当涉及整数的算术运算的结果超出该数据类型的最大值(或最小值)时,MATLAB 也会将其设置为最大值(或最小值):
x = int8(100) * 3
x =int8127x = int8(-100) * 3
x =int8-128
整数运算
如何对表示信号和图像的整数数据执行算术运算。
加载整数信号数据
加载由四种乐器发出的信号组成的测量数据集,并将数据中 8 位和 16 位的 A 至 D 结果保存为 int8
、int16
和 uint16
。时间存储为 uint16
。
load integersignal% Look at variables
whos Signal1 Signal2 Signal3 Signal4 Time1Name Size Bytes Class AttributesSignal1 7550x1 7550 int8 Signal2 7550x1 7550 int8 Signal3 7550x1 15100 int16 Signal4 7550x1 15100 uint16 Time1 7550x1 15100 uint16
对数据绘图
首先,对两个信号绘图以查看信号范围。
plot(Time1, Signal1, Time1, Signal2);
grid;
legend('Signal1','Signal2');
此时可以看到 int8
的值。可能需要对这些值进行缩放以计算信号代表的实际物理值,例如电压。
处理数据
可以对整数执行标准算术运算,例如 +
、-
、*
和 /
。假设要计算 Signal1 和 Signal2 的和。
SumSig = Signal1 + Signal2; % Here we sum the integer signals.
现在,对和信号绘图并查看饱和位置。
cla;
plot(Time1, SumSig);
hold on
Saturated = (SumSig == intmin('int8')) | (SumSig == intmax('int8')); % Find where it has saturated
plot(Time1(Saturated),SumSig(Saturated),'rd')
grid
hold off
标记所示即信号饱和的位置。
加载整数图像数据
接下来,看一下对一些图像数据执行的算术运算。
street1 = imread('street1.jpg'); % Load image data
street2 = imread('street2.jpg');whos street1 street2Name Size Bytes Class Attributesstreet1 480x640x3 921600 uint8 street2 480x640x3 921600 uint8
可以看出,图像为 24 位颜色,存储为三个 uint8
数据平面。
显示图像
显示第一个图像。
cla;
image(street1); % Display image
axis equal
axis off
显示第二个图像
缩放图像
可以按一个双精度常量缩放图像,但仍保持以整数形式存储图像。例如,
duller = 0.5 * street2; % Scale image with a double constant but create an integer
whos dullerName Size Bytes Class Attributesduller 480x640x3 921600 uint8
subplot(1,2,1);
image(street2);
axis off equal tight
title('Original'); % Display imagesubplot(1,2,2);
image(duller);
axis off equal tight
title('Duller'); % Display image
添加图像
现在,将两个街道图像叠加在一起,并对重影结果绘图。
更多推荐
Matlab中数值类型(二)
发布评论