概述
目录
基本运算元素
1. 变量
2. 工作空间
3. 特殊值
4. 关键字
5. 运算符
数据类型
1. 数值型
整数
浮点数
复数
2. 逻辑型
3. 字符数组和字符串数组
4. 结构数组
5. 单元数组
6. 函数句柄
创建函数句柄
匿名函数
使用函数句柄的好处:
7. 日期和时间
矩阵操作
矩阵连接
重塑矩阵形状
矩阵元素移位和排序
向量(数集)操作
基本运算元素
1. 变量
clearvars 可以清除内存中某些或全部变量,同时可以保留制定变量
clearvars - except b
变量类型:
- 局部变量
- 全局变量
global a
全局变量要放在开始出声明
- 永久变量
persistent a
2. 工作空间
变量存储在一块内存区域中,称为“基本工作空间” - 脚本文件或命令行创建的变量存在其中
函数不使用基本工作空间,有自己的函数空间
函数空间中生成的变量,只在函数空间内有效;基本 - 基本
函数空间中指派变量到基本工作空间,使用assignin函数
assingin(workSpace,'varName',varValue)
即指派变量varName到workSpace中,且初始值为varValue
workSpace为‘base’表示基本工作空间;取值为‘caller’表示调回函数空间
不能在基本工作空间中指派变量到函数空间
3. 特殊值
4. 关键字
查看或检查关键字:
iskeyword('if')
5. 运算符
- 算术运算
- 关系运算
- 逻辑运算
- 位运算
- 特殊运算
数据类型
1. 数值型
默认将所有数值存为double,但整数和单精度更节省空间
所有数值型都支持基本的数组操作,如下标操作和尺寸重塑。
?除int64和uint64外都可用于数学运算
整数
常见整数操作函数
- ceil - 向无穷大方向取整
- floor - 向无穷小方向取整
- fix - 向0取整
- round - 四舍五入
- isinteger - 判断是否为整数数组
- isnumeric - 判断是否为数值数组
浮点数
以double为例(双精度 64位)
s - 63 - 符号位:0为正 1为负
e - 62~52 - 指数部分:偏移量为1023
f - 51~0 - 小数部分
value = (-1)^s × 2^(e-1023) × 1.f —— 一般情况
double可以将其他数值型数据、字符或逻辑树转换成双精度
浮点数操作函数
- isfloat - 检查是否为浮点数
- realmax - 返回计算机能表示的最大浮点数
- realmin - 返回计算机能表示的最小浮点数
- eps - 浮点相对精度
- isreal - 检查数组所有元素是否为实数
复数
产生复数的方法
- 直接生成(不能产生0为虚部的复数)
- complex函数生成
complex(a,b)
c = a + bi
complex(a)
c = a + 0i
real - 提取实部
imag - 提取虚部
format改变数值显示方式,不影响运算结果
2. 逻辑型
any - 全假返回假,否则返回真
all - 全真返回真,否则返回假
any(A,dim) - dim = 1 返回行向量,对列向量进行计算
dim = 2 返回列向量,对行向量进行计算
3. 字符数组和字符串数组
matlab中区分字符数组与字符串数组的方法为
字符数组用单引号 ‘’ 表示 元素为字符
字符串数组用双引号 “” 表示 元素为字符序列
>> a = 'hello';b = "hello";
>> whos a
Name Size Bytes Class Attributes
a 1x5 10 char
>> whos b
Name Size Bytes Class Attributes
b 1x1 150 string
关于字符串“string”占用了150个字节是因为本身字符串的表征就需要占用一定大小,字符串所占空间以阶梯形式进行变化
正则表达式相关函数
regexp、regexpi、regexprep、regexptranslate
正则表达式理解:
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码
4. 结构数组
用字段来容纳数据的matlab数组
创建结构的方法
- 使用点号运算符
>> results.name = 'xin';
>> results.rank = 1;
>> results.score = [100 100 100];
>> results
results =
包含以下字段的 struct:
name: 'xin'
rank: 1
score: [100 100 100]
%扩充数组
>> results(2).name = 'liu';
>> results(2).rank = 2;
- 利用struct函数创建结构数组
>> s = struct('name',{'xin','liu'},'rank',{1,2})
5. 单元数组
单元数组是在一个数组中包含多个单元(cell),每个单元作为一个独立存储单元存储数据
通过矩阵索引操作获取数据
创建单元数组的方法
- 使用大括号赋值语句
单元索引:把序号放在()中,右边将单元内容放在花括号中
>> um(1) = {{'love','xin'}};
>> um(2) = {['1997','0420']};
>> um(3) = {['for','ever']}
um =
1×3 cell 数组
{1×2 cell} {'19970420'} {'forever'}
%这里的um(1)是一个cell,因此无法直接显示,需要用{}的索引才可以看到cell里面的内容
>> um{1}(1)
ans =
1×1 cell 数组
{'love'}
>> um{3}
ans =
'forever'
>> um(3)
ans =
1×1 cell 数组
{'forever'}
%索引不同也可以看到收到的是不同的层级
内容索引:复制语句左边,将单元下标放在花括号中;右边指定单元内容
内容与单元索引的区别是:使用单元索引出来的是该单元{}表示,使用内容索引出来的是该单元内的内容,在创建时侯的效果是一样的
6. 函数句柄
提供了简介调用函数的方法
创建函数句柄
- @运算符
>> fh1 = @sin;
>> fh2 = @(x)sin(x);
- str2func函数
>> fh3 = str2func('sin');
- matlabFunction函数
>> fh4 = matlabFuncyion(sin(x));
%使用该命令前用 syms x 命令创建符号变量
验证是否成功创建函数句柄
>> feval(fh1,pi/2)
ans =
1
matlab映射句柄到指定的函数,并在句柄中保存映射信息
如果同名函数有多个,函数按一定优先级调用
可以用which函数查询调用
- 函数调用可以提高函数的执行效率(反复调用时)
- 函数句柄可以用来标识子函数、私有函数和嵌套函数
function out = myDiff(a,b)
if (a>b)
out = feval(@fun1,a,b);
else
out = feval(@fun1,b,a);
end
end
function out = fun1(a,b);
out = a - b;
end
>> myDiff(1,2)
ans =
1
- 可以使用str2func 实现操作对象的函数
>> h_sin = str2func('sin')
h_sin =
包含以下值的 function_handle:
@sin
>> feval(h_sin,pi)
ans =
1.2246e-16
在这里h_sin和@sin是等价的
- 可以在创建的函数中使用某一函数
function x = plotSin(fhandle,data)
plot(data,fhandle(data))
end
>> plotSin(h_sin,t)
>> plotSin(@sin,t)
% 均可正常运行
匿名函数
没有函数名只有函数句柄的特殊函数
即没有function out = 函数名(in),没有生成m文件,只有一个函数句柄
>> plotSin2 = @(x) plot(x,sin(x))
plotSin2 =
包含以下值的 function_handle:
@(x)plot(x,sin(x))
>> plotSin2(t)
匿名函数编写的代码很简洁,并且执行效率很高
函数名 = @(vars1,vars2,...) 表达式/函数
使用函数句柄的好处:
1. 提高运行速度?
2. 使用可以与使用变量一样方便
3. 可以将函数句柄作为输入参数传递给GUI对象
4. 函数句柄是将函数“变量化”,因此可以实现批量函数的执行(arrayfun)
>> fun{1} = rand(3,6);
>> fun{2} = rand(4,6);
>> fun{3} = rand(6,6);
>> counts = arrayfun(@(x) numel(x{:}), fun)
counts =
18 24 36
% 在counts里面 @(x) numel(x{:}) 为匿名函数, fun为自变量
>> func{1} = @() rand(3,6);
>> func{2} = @() rand(4,6);
>> func{3} = @() rand(6,6);
>> counts = arrayfun(@(y) timeit(y{:}), func)
counts =
1.0e-06 *
0.4110 0.3879 0.4740
% 观察到如果这里用的是fun将会出现提示:第一个参数必须为不带输入参数的函数句柄。
因为timeit需要对函数进行时间计算,而fun实则为一个数组,func才是一个函数
>> counts = arrayfun(@(y) numel(y{:}), func)
counts =
1 1 1
% 此时可以观察到func的元素个数均为1
7. 日期和时间
三种格式:
日期字符串
串行日期数(serial date numbers)
日期向量
% 日期字符串
>> date
ans =
'18-Sep-2022'
% 串行日期数
>> now
ans =
7.3878e+05
%日期向量
>> clock
ans =
1.0e+03 *
2.0220 0.0090 0.0180 0.0160 0.0580 0.0227
格式转换
datestr 转换为日期字符串 (使用最多)
datenum 转换为串行日期数
datevec 转换为日期向量
str = datestr(DT, dataform)
矩阵操作
矩阵连接
如果是两个不同类型的矩阵将按照优先级进行连接
[a;b] - cat(1,a,b) - vercat(a,b)
[a,b] - cat(2,a,b) - horzcat(a,b)
[a;a] - repmat(a,[2 1])
[a a] - repmat(a,[1,2])
重塑矩阵形状
length - 返回矩阵最长维的长度
size - 返回矩阵每一维长度
numel - 返回矩阵的元素数
ndims - 返回矩阵的维数
reshape - 重塑矩阵形状
B = reshape(A,m,n) or B = reshape(A,[m n]) 确定的m*n矩阵
B = reshape(A,m,[]) or B = reshape(A,[],n) 仅确定一个维度,另一维度由计算机确定(无法整除会报错)
重塑为列向量用(:) 行向量为(;)
矩阵元素移位和排序
circshift 循环移动矩阵的元素
sort 对数组行或列进行升序或降序排列
sortrows 含列值的升序或降序排列行
issorted 确定数组元素是否排序
[B, index] = sort(A, dim, mode)
dim - 1 对每列的元素排序 2 对每行的元素排序
mode - ascend 升序 descend 降序
[B, index] = sortrows(A, column)
对A的行按列的升值排序,column为正数 升序,负数 降序
向量(数集)操作
行或列维数为1的是向量
数集为元素互斥的向量
最后
以上就是爱笑彩虹为你收集整理的MATLAB GUI 自学笔记:1. 预备知识_1基本运算元素数据类型矩阵操作的全部内容,希望文章能够帮你解决MATLAB GUI 自学笔记:1. 预备知识_1基本运算元素数据类型矩阵操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复