Matlab中数值类型(二)

2023-10-26

目录

单精度运算

创建双精度数据

转换为单精度

创建单精度零和一

算术运算和线性代数运算

用于处理单精度或双精度的一个程序

整数

整数类

创建整数数据

整数类的算术运算

整数类的最大值和最小值

整数运算

加载整数信号数据

对数据绘图

处理数据

加载整数图像数据

显示图像

缩放图像

添加图像


单精度运算

        如何对单精度数据执行算术运算和线性代数运算。此外,还说明了如何根据输入相应地按单精度或双精度计算结果。

创建双精度数据

        首先创建一些数据,默认情况下为双精度。

Ad = [1 2 0; 2 5 -1; 4 10 -1]

Ad = 3×3

     1     2     0
     2     5    -1
     4    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 n


  Name         Size            Bytes  Class     Attributes

  A            3x3                36  single              
  Ad           3x3                72  double              
  O         1000x1              4000  single              
  Z         1000x1              4000  single              
  n            1x1                 8  double 

        可以看到,部分变量的类型为single,变量AAd 的单精度版本)需要一半的内存字节数用于存储,因为单精度仅需要四字节(32 位),而双精度需要 8 字节(64 位)。

算术运算和线性代数运算

        可以对单精度数据执行标准算术运算和线性代数运算。

B = A'    % Matrix Transpose

B = 3x3 single matrix

     1     2     4
     2     5    10
     0    -1    -1


whos B
  Name      Size            Bytes  Class     Attributes

  B         3x3                36  single      

        可以看出,此操作的结果 B 为单精度。

C = A * B % Matrix multiplication
C = 3x3 single matrix

     5    12    24
    12    30    59
    24    59   117

C = A .* B % Elementwise arithmetic
C = 3x3 single matrix

     1     4     0
     4    25   -10
     0   -10     1

X = inv(A) % Matrix inverse
X = 3x3 single matrix

     5     2    -2
    -2    -1     1
     0    -2     1

I = inv(A) * A % Confirm result is identity matrix
I = 3x3 single matrix

     1     0     0
     0     1     0
     0     0     1

I = A \ A  % Better way to do matrix division than inv
I = 3x3 single matrix

     1     0     0
     0     1     0
     0     0     1

E = eig(A) % Eigenvalues
E = 3x1 single column vector

    3.7321
    0.2679
    1.0000

F = fft(A(:,1)) % FFT
F = 3x1 single column vector

   7.0000 + 0.0000i
  -2.0000 + 1.7321i
  -2.0000 - 1.7321i

S = svd(A) % Singular value decomposition
S = 3x1 single column vector

   12.3171
    0.5149
    0.1577

P = round(poly(A)) % The characteristic polynomial of a matrix
P = 1x4 single row vector

     1    -5     5    -1

R = roots(P) % Roots of a polynomial
R = 3x1 single column vector

    3.7321
    1.0000
    0.2679

Q = conv(P,P) % Convolve two vectors
Q = 1x7 single row vector

     1   -10    35   -52    35   -10     1

R = conv(P,Q)
R = 1x10 single row vector

     1   -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 fibodemo


function 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) >= tol
   nterms = nterms + 1;
   temp  = fnext;
   fnext = fnext + fcurrent;
   fcurrent = temp;
end

        请注意,我们初始化了几个变量,即 fcurrentfnext 和 goldenMean,初始化所用的值取决于输入数据类型,容差 tol 也取决于该类型。与等效的双精度计算相比,单精度要求计算的项较少。

整数

整数类

        MATLAB® 具有四个有符号整数类和四个无符号整数类。有符号类型使您能够处理负整数以及正整数,但表示的数字范围不如无符号类型广泛,因为有一个位用于指定数字的正号或负号。无符号类型提供了更广泛的数字范围,但这些数字只能为零或正数。MATLAB 支持以 1 字节、2 字节、4 字节和 8 字节几种形式存储整数数据。如果使用可容纳数据的最小整数类型来存储数据,则可以节省程序内存和执行时间。例如,不需要使用 32 位整数来存储值 100。下面列出了八个整数类、使用每种类型可存储的值范围以及创建该类型所需的 MATLAB 转换函数:

值的范围

转换函数

有符号 8 位整数

-2^7 到 2^7-1

int8

有符号 16 位整数

-2^15 到 2^15-1

int16

有符号 32 位整数

-2^31 到 2^31-1

int32

有符号 64 位整数

-2^63 到 2^63-1

int64

无符号 8 位整数

0 到 2^8-1

uint8

无符号 16 位整数

0 到 2^16-1

uint16

无符号 32 位整数

0 到 2^32-1

uint32

无符号 64 位整数

0 到 2^64-1

uint64

创建整数数据

        MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据。要以整数形式存储数据,需要从double转换为所需的整数类型。使用上表中所示的转换函数之一。

        例如,如果要以16位有符号整数形式存储赋给变量x的值 325,请键入

x = int16(325);

        如果要转换为整数的数值带有小数部分,MATLAB 将舍入到最接近的整数。如果小数部分正好是 0.5,则 MATLAB 会从两个同样临近的整数中选择绝对值大小更大的整数:

x = 325.499;
int16(x)
ans =
	
  int16

   325         

x = x + .001;
int16(x)
ans =

  int16

   326    

        如果需要使用非默认舍入方案对数值进行舍入,MATLAB 提供了以下四种舍入函数:round、fix、floor和ceil。fix 函数能够覆盖默认的舍入方案,并朝零舍入(如果存在非零的小数部分):

x = 325.9;

int16(fix(x))
ans =

  int16

   325

        同时涉及整数和浮点数的算术运算始终生成整数数据类型。MATLAB 会在必要时根据默认的舍入算法对结果进行舍入。以下示例生成1426.75的确切答案,然后MATLAB将该数值舍入到下一个最高的整数:

int16(325) * 4.39
ans =

  int16

   1427

        在将其他类(例如字符串)转换为整数时,这些整数转换函数也很有用:

str = 'Hello World';

int8(str)
ans =

  1×11 int8 row vector

    72   101   108   108   111    32    87   111   114   108   100

        如果将NaN值转换为整数类,则结果为该整数类中的 0 值。例如,

int32(NaN)
ans =

  int32

   0

整数类的算术运算

        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 =

  int8

   127

intmin('int8')   
ans =

  int8

   -128

        如果将大于某个整数数据类型的最大值的数值转换为该类型,MATLAB会将其设置为最大值。同样,如果转换小于该整数数据类型的最小值的数值,MATLAB会将其设置为最小值。例如,

x = int8(300)
x =

  int8

   127
               
x = int8(-300)
x =

  int8

   -128

        此外,当涉及整数的算术运算的结果超出该数据类型的最大值(或最小值)时,MATLAB 也会将其设置为最大值(或最小值):

x = int8(100) * 3
x =

  int8

   127

x = int8(-100) * 3
x =

  int8

   -128

整数运算

        如何对表示信号和图像的整数数据执行算术运算。

加载整数信号数据

        加载由四种乐器发出的信号组成的测量数据集,并将数据中 8 位和 16 位的 A 至 D 结果保存为 int8int16 和 uint16。时间存储为 uint16

load integersignal

% Look at variables
whos Signal1 Signal2 Signal3 Signal4 Time1
  Name            Size            Bytes  Class     Attributes

  Signal1      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 street2
  Name           Size                Bytes  Class    Attributes

  street1      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 duller
  Name          Size                Bytes  Class    Attributes

  duller      480x640x3            921600  uint8              
subplot(1,2,1);
image(street2);
axis off equal tight
title('Original');  % Display image

subplot(1,2,2);
image(duller);
axis off equal tight
title('Duller');    % Display image

                

添加图像

        现在,将两个街道图像叠加在一起,并对重影结果绘图。                    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab中数值类型(二) 的相关文章

  • 如何在 MATLAB 中随机排列 3D 矩阵中的列

    我有 3D 矩阵 10000 x 60 x 20 我需要排列第二维和第三维以保持列完整 对于 2D 矩阵 我使用 RANDPERM pidx randperm size A 2 Aperm A pidx 我不能只应用 RANDPERM 两次
  • 在 MATLAB 中加载多个图像

    这是所需的工作流程 我想将 100 张图像加载到 MATLAB 工作区 在图像上运行一堆我的代码 将我的输出 我的代码返回的输出是一个整数数组 保存在一个新数组中 最后 我应该有一个数据结构来存储图像 1 100 的代码输出 我该怎么做呢
  • 将具有不同格式的文本文件读取到 MATLAB

    我有一个文本文件 但不幸的是它的格式很差 但是我想将文本文件的内容读入矩阵 但我不知道该怎么做 当尝试使用fscanf textscan textread其余的它只是将所有内容复制到一个单元格中 但我不希望那样 内容如下 所以我只想读取小数
  • 找出哪些超类包含属性或方法实现

    如果我已经正确记录了方法或属性 我可以通过键入找到它的定义位置help class method 这会告诉我Help for class method is inherited from superclass otherclass 通常 这
  • MATLAB - 相关属性和计算

    假设我有以下类来计算二次方程的解 classdef MyClass lt handle properties a b c end properties Dependent true x end methods function x get
  • 如何从命令行运行Matlab?

    是否可以从 Mac 命令行运行 Matlab 命令 The matlab脚本位于binMATLAB 应用程序包的子目录 在我的机器上 这意味着我可以像这样运行它 Applications MATLAB R2012a Student app
  • 在 Matlab 中按下某个键停止无限 while 循环

    我有一个无限的 while 循环 我想在按下键盘按键时停止它 伪代码 While 1 do stuff listening for key if key is pressed break end end 功能waitforbuttonpre
  • 多个常数到一个矩阵并将它们转换为matlab中的块对角矩阵

    我有a1 a2 a3 它们是常数 我有一个矩阵A 我想做的是得到a1 A a2 A a3 A三个矩阵 然后我想将它们转移到对角块矩阵中 对于三个常数的情况 这很容易 我可以让b1 a1 A b2 a2 A b3 a3 A 然后在matlab
  • 将函数应用于滚动窗口

    假设我有一个很长的清单A我想要计算的值 例如长度 1000 std100 对 即我想计算std A 1 100 std A 2 101 std A 3 102 std A 901 1000 在 Excel VBA 中 可以通过编写例如以下内
  • RFC 4648(Base[16,32,64])在 Matlab 中的实现

    有没有任何实施RFC4648 https tools ietf org html rfc4648 Base16 Base32 和 Base64 数据编码 Matlab 中 在 MATLAB 中您可以轻松使用嵌入式Java 功能 http w
  • 如何在 MATLAB 中编写向量化函数

    我刚刚学习MATLAB 我发现很难理解循环与矢量化函数的性能因素 在我之前的问题中 MATLAB 中的嵌套 for 循环非常慢 预分配 https stackoverflow com q 7811239 518169我意识到使用向量化函数与
  • 用 t 个随机数生成位向量

    我想生成一个数组 向量v大小的p with t那些和p t零 的位置t ones must是随机的 这是我迄今为止编写的解决方案 但我不确定它是否是最有效的解决方案 另外我从来没用过random device or mt19937 找到他们
  • matlab 数组中的 DICOM 维度(所有帧都以数组的最后一个维度结束)

    在我的 GUI 之一中 我加载 DICOM 图像 有时它们只是一个体积和另一个维度 当我将它们加载到 Matlab 中时 一切都会到达我想要的位置 handles inf dicominfo filepath filename handle
  • 如何生成行和列不重复的随机矩阵?

    如何生成具有特定范围的行和列中不重复的随机矩阵 示例 3x3 范围 1 到 3 2 1 3 3 2 1 1 3 2 示例 4x4 范围 1 到 4 4 1 3 2 1 3 2 4 3 2 4 1 2 4 1 3 解决这个问题的一种方法是生成
  • 将角度定量数据转换为定性图像

    我是一名晶体学家 试图从多达 5000 个文件中分析晶体方向 Matlab 能否转换表格中的角度值 如下所示 进入一个看起来像这样的表 这是一个基于 Lakesh 想法的更具体的例子 然而 这将处理任意数量的旋转 首先从中间有一条带的基本圆
  • parfor 和处理类

    我有一个句柄类 classdef A
  • MATLAB 写入多页 tiff 指数慢

    我正在尝试编写一个多页 tiff 文件 该文件是 128 像素 x 128 像素 x 122000 帧的 16 位无符号整数 ImageJ 或简短的 Python 脚本可以在快速机器上在一分钟内完成此操作 在同一台机器上 无论使用我尝试过的
  • 通过在 MATLAB 中填充当前值来扩展数组

    我有一个相当简单的问题 我只是想知道在 MATLAB 中是否有一种简单的方法可以做到这一点 即一个函数来完成此任务 而不是自己编写循环或其他东西 假设我有一个时间序列 其中 Time 是1 1 1000和数据是2 1 1 1000 我想通过
  • 检测 MATLAB 帮助浏览器

    我想为大型 MATLAB 应用程序创建一些 HTML 文档 主要在 MATLAB 帮助浏览器 从 11b 开始的任何版本的 MATLAB 中 查看 这将有一些自定义 CSS 但没有什么非常复杂的 但是 我还希望在其他浏览器中可以查看相同的文
  • 在matlab中对矩阵元素求和的有效(最快)方法

    让我们有矩阵A say A magic 100 我见过两种计算矩阵所有元素之和的方法A sumOfA sum sum A Or sumOfA sum A 其中一个比其他更快 或更好的练习 吗 如果有的话是哪一个 或者它们都同样快 看来你无法

随机推荐