冈萨雷斯Matlab版第二章(基本原理)要点记录

こ雲淡風輕ζ 提交于 2019-11-27 16:22:56

标准数组生成

zero(M, N) 生成一个大小是MN的double类矩阵,其元素均为0
ones(M, N)生成一个大小是M
N的double类矩阵,其元素均为1
ture(M, N)生成一个大小是MN的logical类矩阵,其元素均为1
false(M, N)生成一个大小是M
N的logical类矩阵,其元素均为0
magic(M)生成一个大小均为MN的“魔方矩阵”,在该矩阵中,每一行的元素之和、每一列的元素之和以及主对角线中的元素之和均相等,易于生成,元素均为整数
rand(M, N)生成一个大小是M
N的矩阵,其元素都是在区间[0,1]中均匀分布的随机数
randn(M, N)生成一个大小是M*N的矩阵,其元素是正态分布的随机数,随机数均值为0,方差为1

数组和矩阵算术运算符

图像是等价于矩阵的二维数组,因此以下所有运算符均适用于图像
.*表示数组乘法,times(A, B)这种乘法的乘积是与A和B大小相同的数组,其每个元素都是A和B中相应元素的乘积
*表示传统意义的矩阵乘法mtimes(A, B)
./数组右除rdivide()A, B
.\数组左除ldivide(A, B)
/矩阵右除mrdivide(A, B)
\矩阵左除mldivide(A, B)
.^数组求幂power(A, B)
^矩阵求幂mpower(A, B)
.'向量和均值转置transpose(A)
'向量和均值复共轭转置ctranspose(A)
+两个操作数时表示数组与矩阵的加法plus(A, B),一个操作数表示一元加uplus(A)
-两个操作数时表示数组与矩阵的减法minus(A, B),一个操作数表示一元减uminus(A)
:冒号运算符,用于分区提取

IPT支持的图像算术函数

imadd两幅图像相加或把常数加到图像
imsubtract两幅图像相减或从图像中减去常数
immultiply两幅图像相乘,其中相乘是在相应的像素对间进行的;或者图像乘以一个常数
imdivide两幅图像相初,其中相除是在相应的像素对间进行的;或者图像除以一个常数
imabsdiff计算两幅图像间的绝对差
imcomplement对图像求补
imlincomb计算两幅或多幅图像的线性组合

逻辑函数

xor异或,若两个操作数逻辑上不同,则函数返回1,否则,返回0
all若一个向量中的所有元素都非零,则函数all返回1,否则返回0
any若一个向量中的任何元素都非零,则函数any返回1,否则返回0.该函数在矩阵中按列操作

返回逻辑1或0的函数

iscell(C)若C是单元数组,则为真
iscellstr(s)若s是字符串单元数组,则为真
ischar(s)若s是字符串,则为真
isempty(A)若A是空数组[],则为真
isequal(A, B)若A和B有相同的元素和维数,则为真
isfield(A, 'name')若’name’是结构S的一个域,则为真
isfinite(A)若数组A的元素有限,则为真
isinf(A)若数组A的元素无限,则为真
isletter(A)若数组A的元素是字母表中的字符,则为真
islogical(A)若A是逻辑数组,则为真
ismember(A, B)若A的元素也是B的元素,则为真
isnan(A)若S的元素是NaN,则为真
isnumeric(A, B)若A是数值数组,则为真
isprime(A)若A的元素是素数,则为真
isreal(A)若A的元素无虚部,则为真
isspace(A)若A的元素是空白字符,则为真
issparse(A)若A是稀疏矩阵,则为真 isstruct(S)若S第一个结构,则为真

常用变量和常量

ans最新的答案(变量)
eps浮点数的相对精度,常加在表达式的分母中,防止分母为0
i/(j)虚数单位
Nan /nan非数的缩写,Not-a-Number
pi圆周率
realmax计算机所能表示的最大浮点数
realmin计算机所能表示的最小浮点数
computer计算机类型
versionMATLAB版本
e表示10的幂次

代码优化

向量化循环

简单地将for循环和while循环转换为等价的向量或矩阵运算。向量化代码的运行速度比基于for循环的代码运行速度快1000倍左右。
假设我们要生成一个一维函数,该函数的表达式为:
f(x) = A sin(x / 2π) ; x = 0, 1, 2, ··· , M - 1
实现该计算的for循环为:

for x = 1 : M
	f(x) = A * sin((x - 1) / (2 * pi));
end

但是在向量化后,代码的效率会更高,上述代码可简化为:

x = 0 : M - 1;
f = A * sin(s / (2 * pi));

当将被评估的函数有两个变量时,MATLAB使用函数meshgrid来实现二维函数的评估,该函数的语法为
[C, R] = meshgrid(c, r)
该函数将由行向量c和r指定的域变换为数组C和R,这两个数组能用来评估有着两个变量的函数和三维表面图(在meshgrid的输入输出中,列总是首先列出)。函数将网格向量c和r复制到C和R,产生矩形网格(C,R)的坐标。 网格矢量c被复制次数(r)次以形成C列。网格向量r复制次数(c)次以形成R行。

预分配数组

另一种方法是在程序中预分配数组的大小。在处理数值或逻辑数组时,预分配只是简单地创建有着适合维数的数组,数组的元素均为0.
我们在处理两幅大小均为1024*1024像素的图像f和g,则预分配由以下语句构成:
f = zeros(1024);
g = zeros(1024);
处理大数组时,预分配帮助我们减少存储器碎片。动态存储器的分配和去分配会使得存储器出现碎片。实际的结果是在计算过程中可能会有足够空间的可用物理存储器,但可能没有足够的连续空间来容纳一个较大的变量。预分配通过在计算开始就允许MATLAB为大数据构造保留足够的存储空间,来组织无连续空间的情形出现。

单元数组与结构简介

单元数组使用大括号将数组括起。单元数组的一个重要属性是,它包含的是参量的副本,而不是指向该参量的指针。
若我们处理一个单元数组
c = {A, B}
其中A和B都是矩阵,则这些矩阵稍后会在程序中改变,但是c的内容不变。

结构类似于单元数组,它们都允许将不同的数据集集成到单个变量中,但与单元数组不同的是,单元数组中的单元由数组寻址,而结构的元素由域来寻址。使用域可增强M函数的可读性,但具体取决于应用。
对于单元数组:

c = {'gauss', [1 0; 0 1], 3};
c{1}   % ans = gauss
c{2}  % ans = [1 0; 0 1]
c{3}  % ans = 3

对于结构,令s表示结构变量,并使用(任意的)域名

s.char_string = 'gauss';
s.matrix = [1 0; 0 1];
s.scalar = 3;
% 利用域名寻址
s.char_string  % ans = gauss
% 类比即可···
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!