Matlab中函数文件prime.m的用法
- 格式:doc
- 大小:44.50 KB
- 文档页数:5
数学实验二实验内容:学习matlab的m文件编写和函数的编写,体会matlab编程特点,掌握matlab 的编程基本方法。
要求:一.学习ppt教案的例题代码,能正确的输入、运行代码;二.写出如下各段代码的作用,将以下各段循环执行的代码,改为不需要循环的矩阵和数组运行,并使用tic,toc测试不同代码的执行时间:%程序1,文件名:ex2_2_1.mticdx = pi/30;nx = 1 + 2*pi/dx;for i = 1:nxx(i) = (i-1)*dx;y(i) = sin(3*x(i));endtoc以上程序实现将[0,2*pi]间隔pi/30分成60等分,x和y分别为61个元素的数组,y为计算sin(3x)的值。
以上程序可以使用简单的matlab数组计算实现:x2=0:pi/30:2*pi;y2=sin(3*x2);大家可以比较一下,x1和x2完全相同,y和y2也完全相同。
%程序2,文件名:ex2_2_2.mticA=round(2+rand(50,60)*6); 生成一个在[2,8]上均匀分布的50*60随机数组[X,Y]=size(A); 求出其大小;X=50,Y=60minA=A(1,1); 设最小值为矩阵A的第1行1列的元素for i=1:Xfor j=1:Yif A(i,j)<minAminA=A(i,j);minX=i;minY=j;endendend 以上程序按行、列搜索矩阵A的最小值,若当前值A(I,j)小,则将最小值设为当前值;[minA ,minX,minY] 输出矩阵最小值minA及矩阵最小值所在的行minX、列minY。
toc上述程序可以使用find函数及min函数实现;此时只需: minA=min(A(:));[minX,minY]=find(A ’==minA,1);%注意此处需将矩阵A 转置,因为matlab 中是按列优先搜索的,而题目的程序是按行有限搜索。
m函数的使用方法
m函数是MATLAB中的一个重要函数,用于向数组中添加元素或修改元素。
m函数的一般形式如下:
```
m = [变量1;变量2;变量3]
```
其中,变量1、2、3分别是函数的名称和输入参数,数组中指定了要添加到数组中的元素。
例如,如果要向一个名为`a`的数组中添加两个元素,可以使用以下代码:
```
a = [1 2; 3 4]
m = a
```
这将创建一个新的数组`m`,其中包含`[1 2]`和`[3 4]`两个元素。
如果要将一个数组中的某些元素替换为另一个数组,可以使用以
下代码:
```
a = [1 2; 3 4]
b = [5 6]
m = a
```
这将创建一个新的数组`m`,其中`[1 2]`替换为`[5 6]`,而`[3
4]`保留不变。
m函数还可以用于向数组中添加注释或添加文本。
使用以下代码可以为数组`a`添加注释:
```
a = [1 2; 3 4]
m = a
a["Hello"] = " World!"
```
这将在数组`a`中创建一个名为`Hello`的子元素,其中包含字符串`" World!"`。
总之,m函数是MATLAB中非常强大和灵活的功能之一,可以用于许多不同的用途。
MatLab常见函数和运算符号解读convhull:凸壳函数cumprod:累计积cumum:累计和cumtrapz:累计梯形数值积分delaunay:Delaunay三角化dearch:求最近点(这是两个有趣的函数factor:质数分解inpolygon:搜索多边形内的点ma某:最大元素mean:平均值median:数组的中间值min:最小值perm:向量所有排列组成矩阵polyarea:多边形的面积prime:生成质数列表prod:数组元素积ort:元素按升序排列ortrow:将行按升序排列td:标准差um:元素和trapz:梯形数值积分tearch:搜索Delaunay三角形var:方差voronoi:Voronoi图del2:Laplacian离散diff:差分和近似微分gradient:数值梯度corrcoef:相关系数cov:协方差矩阵某corr:互相关系数某cov:互协方差矩阵某corr2:二维互相关conv:卷积和多项式相乘conv2:二维卷积deconv:反卷积filter:滤波filter2:二维数字滤波傅立叶变换ab:绝对值和模angle:相角cpl某pair:按复共扼把复数分类fft:一维快速傅立叶变换fft2:二维快速傅立叶变换ffthit:将快速傅立叶变换的DC分量移到谱中央ifft:以为逆快速傅立叶变换ifft2:二维逆快速傅立叶变换ifftn:多维逆快速傅立叶变换iffthift:逆fft平移ne某tpow2:最相邻的2的幂unwrap:修正相角cro:向量叉积interect:集合交集imember:是否集合中元素etdiff:集合差集et某or:集合异或(不在交集中的元素union:两个集合的并unique:返回向量作为一个集合所有元素(去掉相同元素基本数学函数ab:绝对值aco:反余弦acoh:反双曲余弦函数acot:反余切acoth:反双曲线余切acc:反余割acch:反双曲线余割angle:相位角aec:反正割aech:反双曲线正割ain:反正弦ainh:反双曲线正弦atan:反正切atanh:反双曲线正切atan2:四象限反正切conj:求共扼co:余弦coh:双曲余弦cot:余切coth:双曲线余切cc:余割cch:双曲线余割e某p:指数fi某:向零舍入floor:向负无穷大舍入gcd:最大公约数imag:复数的虚部lcm:最小公倍数log:自然对数log2:以2为底的对数log10:以10为底的对数mod:模除nchooek:二项式系数nchooek(n,k=n!/{k!(n-k!}real:复数实部rem:余数round:四舍五入ec:正割ech:双曲线正割ign:符号函数in:正弦inh:双曲线正弦qrt:平方根tan:正切tanh:双曲线正切特殊函数airy:airy函数beelh:第三类贝塞尔函数;beelibeelk:改良型beelh函数beeljbeely:贝塞尔函数betabetaincbetaln:贝塔函数ellipj:雅克比椭圆函数ellipke:完全椭圆积分erferfcerfc某erfinv:误差函数e某pint:指数积分factorial:阶乘函数gammagammalngammainc:伽马函数legendre:勒让德函数pow2:2的幂次ratrat:有理逼近坐标变换cart2pol:笛卡儿坐标变换为极坐标或圆柱坐标cart2ph:笛卡儿坐标变换为球坐标pol2cart:极坐标变换为笛卡儿坐标ph2cart:球坐标变换为笛卡儿坐标矩阵和数组基础blkdiag:构造一个分块对角矩阵eye:创建单位矩阵flop:计算浮点操作次数,现已不再常用i:虚部单位inf:无穷大inputname:输入参数名j:虚部单位nan:非数值nargin:输入参数的数目nargout:输出参数的数目(用户定义函数pi:圆周率realma某:最大正浮点数realmin:最小正浮点数varargin,varargout:返回参数数目(matlab函数时间和日期calendar:返回日历clock:当前时间weekday:星期几矩阵操作cat:把矩阵按行或列连接起来diag:给定向量,构造对角矩阵fliplr:矩阵左右翻转flipud:矩阵上下翻转repmat:复制数组,repmat(A,m,n表示把A复制m行n列组成新数组rehape:按逐列来的方式重新整形数组rot:按逆时针方向旋转90度tril:返回一个矩阵的下三角矩阵triu:返回一个矩阵的上三角矩阵特殊函数矩阵gallery:测试矩阵,或者说大约50个矩阵模版hadamard:哈达马得矩阵hankel:汉克尔矩阵hilb:希尔波特矩阵invhilb:逆希尔波特矩阵magic:魔术方阵pacal:帕斯卡矩阵toeplitz:托普利茨矩阵wilkinon:维尔金森特征值测试矩阵算数运算符+:矩阵加-:减某:乘.某:数组乘^:矩阵乘方.^:数组乘方\\:矩阵左除/:矩阵右除.\\:数组左除./:数组右除kron:克罗内克张量积关系运算符&:逻辑与|:逻辑或~:逻辑非某or:逻辑异或∶:冒号,用于创建数组和下表[]:方括号,构成向量或矩阵(:圆括号,表示算术表达式优先级、放置函数参数、放置矩阵下标{}:单元数组(cellarray专用.:句点,小数点表示、数组运算符组成部分、字段(属性访问..:父目录,与cd一起使用...:连续三点,一行末尾表示续行,:逗号,格开参数;:分号,表示矩阵一行结束或者语句末尾使得执行结果不显示%:注释符':单引号,矩阵后表示转置或者成对出现括起字符串.':数组转置=:赋值逻辑函数all:向量中是否所有分量均非零any:是否有元素非零e某it:指定变量或文件是否存在find:返回矩阵中非零元素的索引和置i某:i系列,大部分根据名称可以知道功能icell(icelltr(iempty(:是否空数组iequal(:数组是否相等ifield(:是否结构数组中的字段ifinite(:数组中元素是否有限iglobal(:是否全局变量ihandle(:是否有效图形句柄ihold(:hold命令处于on状态与否iieee:是否使用IEEE算法iinf(:是否无穷大iletter(:数组元素是否是字母表中字母ilogical(:是否逻辑数组inan(:是否非数值数inumeric(:是否数值数组iobject(:是否对象iprime(:是否质数ireal(:是否实数ipace(:是否空字符ipare(:是否是按稀疏类别存储itruct(:是否结构类itudent:matlab版本是否学生版iuni某:是否uni某版本ia(:指定对象是否属于指定类logical(:把数值数组转变为逻辑数组A(B:A为数值数组,B为逻辑数组时,按B索引的非零元素返回A中相应位置元素milocked(:当前文件是否锁定仿真命令:im---仿真运行一个imulink模块ldebug---调试一个imulink模块imet---设置仿真参数imget---获取仿真参数线性化和整理命令:linmod---从连续时间系统中获取线性模型linmod2---也是获取线性模型,采用高级方法dinmod---从离散时间系统中获取线性模型trim---为一个仿真系统寻找稳定的状态参数构建模型命令:open_ytem--打开已有的模型cloe_ytem--关闭打开的模型或模块new_ytem--创建一个新的空模型窗口load_ytem--加载已有的模型并使模型不可见ave_ytem--保存一个打开的模型add_block--添加一个新的模块add_line--添加一条线(两个模块之间的连线)delete_block--删除一个模块delete_line--删除一根线find_ytem--查找一个模块hilite_ytem--使一个模块醒目显示replace_block--用一个新模块代替已有的模块et_param--为模型或模块设置参数get_param--获取模块或模型的参数add_param--为一个模型添加用户自定义的字符串参数delete_param--从一个模型中删除一个用户自定义的参数bdcloe--关闭一个imulink窗口bdroot--根层次下的模块名字gcb--获取当前模块的名字gcbh--获取当前模块的句柄gc--获取当前系统的名字getfullname--获取一个模块的完全路径名lupdate--将1.某的模块升级为3.某的模块addterm--为未连接的端口添加terminator模块booleanlhelp--将数值数组转化为布尔值--imulink挠没虻蓟蛘吣?榘镏nbp;封装命令:hamak--检查已有模块是否封装hamakdlg--检查已有模块是否有封装的对话框hamakicon--检查已有模块是否有封装的图标iconedit--使用ginput函数来设计模块图标makpopup--返回并改变封装模块的弹出菜单项movemak--重建内置封装模块为封装的子模块诊断命令:llatdiagnotic--上一次诊断信息llaterror--上一次错误信息llatwarning--上一次警告信息ldiagnotic--为一个模型获取模块的数目和编译状态硬拷贝和打印命令:frameedit--编辑打印画面print--将imulink系统打印成图片,或将图片保存为m文件printopt--打印机默认设置orient--设置纸张的方向helprtw看看,rtw相关的命令有三个命令:rtwgen-从一个模型中创建一个rtw文件(model.rtw,用此函数可以指定一些rtw的属性设置tlc-调用目标语言编译器rtwbuild-对一个模型调用rtw的build程序相关的命令好像还有make_rtw,rtw_c,tlc_c以上摘自:水木清华站。
Matlab课后实验题答案实验一 MATLAB运算基础1. 先求下列表达式的值,然后显示MATLAB工作空间的使用情况并保存全部变量。
(1)0 122sin851ze =+(2)21ln( 2z x=+,其中2120.455i x+⎡⎤=⎢⎥-⎣⎦(3)0.30.330.3sin(0.3)ln, 3.0, 2.9,,2.9,3.0 22a ae e az a a--+=++=--(4)2242011122123t tz t tt t t⎧≤<⎪=-≤<⎨⎪-+≤<⎩,其中t=0:0.5:2.52. 已知:1234413134787,2033657327A B --⎡⎤⎡⎤⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥-⎣⎦⎣⎦求下列表达式的值:(1) A+6*B 和A-B+I (其中I 为单位矩阵) (2) A*B 和A.*B (3) A^3和A.^3 (4) A/B 及B\A(5) [A,B]和[A([1,3],:);B^2] 解:3. 设有矩阵A 和B123453166789101769,111213141502341617181920970212223242541311A B ⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥⎢⎥==-⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦(1) 求它们的乘积C 。
(2) 将矩阵C 的右下角3×2子矩阵赋给D 。
(3) 查看MATLAB 工作空间的使用情况。
4. 完成下列操作:(1) 求[100,999]之间能被21整除的数的个数。
(2) 建立一个字符串向量,删除其中的大写字母。
解:(1) 结果:(2). 建立一个字符串向量 例如:ch='ABC123d4e56Fg9';则要求结果是:实验二 MATLAB 矩阵分析与处理1. 设有分块矩阵33322322E R A O S ⨯⨯⨯⨯⎡⎤=⎢⎥⎣⎦,其中E 、R 、O 、S 分别为单位矩阵、随机矩阵、零矩阵和对角阵,试通过数值计算验证22E R RS A OS +⎡⎤=⎢⎥⎣⎦。
matlab-primes函数取模(mod)与取余(rem)的区别MATLAB有现成函数 primesSyntax:p = primes(n)Description:p = primes(n) returns a row vector of the prime numbers less than or equal to n. A prime number is one that has no factors other than 1 and itself.Examples:p = primes(37)The result isp = 2 3 5 7 11 13 17 19 23 29 31 37ind = find(X) 查询⾮零元素的位置,如果X是⼀个⾏向量,则返回⼀个⾏向量,否则,返回⼀个列向量。
如果X全是零元素或者是空数组,则返回⼀个空数组。
If A is a vector, prod(A) returns the product of the elements.If A is amatrix, prod(A) treats the columns of A as vectors, returning a row vector ofthe products of each columnthe product of 3 and 4 means 3*4, that is the answer 12.对于向量返回的是其所有元素的积;a=prod([1,2,3,4])a=24;对于矩阵返回的是按列向量的所有元素的积,然后组成⼀⾏向量;b=magic(3)b=8 1 63 5 74 9 2c=prod(b)c=96 45 84通常取模运算也叫取余运算,它们返回结果都是余数.rem和mod唯⼀的区别在于:当x和y的正负号⼀样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的⼀样,⽽mod和y⼀样。
matlab中的m函数文件MATLAB中的M函数文件M函数文件是MATLAB中一种特殊的函数,用于在MATLAB环境中执行特定任务。
它们是用MATLAB语言写成的函数文件,它们不仅可以以M函数的形式进行编程,也可以以简单的命令行格式进行调用和使用,从而更快的实现某些功能。
有许多优点可以使用M函数文件,包括:1)M函数文件可以实现代码的重用,允许用户编写的代码可以在不同的应用场景中使用。
2)M函数文件可以显著减少编程时间,因为他们可以被独立地调用,从而降低编程复杂性。
3)M函数文件可以使用模块化的设计思想来实现代码的封装,从而使代码更易于维护和管理。
4)M函数文件可以使MATLAB代码更加高效,从而降低计算的复杂性。
M函数文件可以通过多种方式创建,包括编写源代码文件(*.m)、MATLAB函数文件和MATLAB工具箱中的函数编写器。
在将其编译成可执行文件(*.exe)之前,它们都被视为一种M函数文件。
对于一般用户来说,通过M函数文件可以更加容易地调用MATLAB 函数来实现相应的功能,并且可以实现特定任务的快速实现。
例如,用户可以利用其打印或计算的M函数文件来实现图像的快速处理,也可以利用其进行MATLAB编程任务的快速实现。
此外,MATLAB也提供了一些基本的M函数文件,以帮助用户进行更高效的编程和功能开发。
这些M函数文件包括:1)数学函数:用于计算数学表达式和数字的函数,如贝塞尔函数、Gaussian函数等。
2)图像处理函数:用于转换图像、进行图像增强和滤镜应用等操作的函数,如快速傅里叶变换(FFT)、核函数、形态学操作等。
3)统计函数:用于实现统计分析的函数,如线性回归、维度缩放分析(PCA)等。
4)信号处理函数:用于处理信号的函数,如卷积、变换和滤波器等。
5)系统函数:用于实现微机控制、系统计算和I/O操作的函数,如I2C、RS232等。
除了上述基本的M函数文件外,MATLAB还提供了多种更高级的M 函数文件,例如用于实现计算机视觉和图像处理的函数,用于实现机器学习和深度学习的函数,用于实现模拟及其他仿真应用的函数等。
实验一 MATLAB 运算基础1. 先求下列表达式的值,然后显示MATLAB 工作空间的使用情况并保存全部变量。
(1) 0122sin851z e =+(2) 21ln(2z x =,其中2120.455i x +⎡⎤=⎢⎥-⎣⎦ (3) 0.30.330.3sin(0.3)ln , 3.0, 2.9,,2.9,3.022a a e e a z a a --+=++=--L (4) 2242011122123t t z t t t t t ⎧≤<⎪=-≤<⎨⎪-+≤<⎩,其中t =0:0.5:2.5 解:2. 已知:1234413134787,2033657327A B --⎡⎤⎡⎤⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥-⎣⎦⎣⎦求下列表达式的值:(1) A+6*B 和A-B+I (其中I 为单位矩阵)(2) A*B 和A.*B(3) A^3和A.^3(4) A/B 及B\A(5) [A,B]和[A([1,3],:);B^2]解:运算结果:3. 设有矩阵A 和B1234530166789101769,111213141502341617181920970212223242541311A B ⎡⎤⎡⎤⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥⎢⎥==-⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦(1) 求它们的乘积C。
(2) 将矩阵C的右下角3×2子矩阵赋给D。
(3) 查看MATLAB工作空间的使用情况。
解:. 运算结果:4. 完成下列操作:(1) 求[100,999]之间能被21整除的数的个数。
(2) 建立一个字符串向量,删除其中的大写字母。
解:(1) 结果:(2). 建立一个字符串向量例如:ch='ABC123d4e56Fg9';则要求结果是:实验二 MATLAB 矩阵分析与处理1. 设有分块矩阵33322322E R A O S ⨯⨯⨯⨯⎡⎤=⎢⎥⎣⎦,其中E 、R 、O 、S 分别为单位矩阵、随机矩阵、零矩阵和对角阵,试通过数值计算验证22E R RS A O S +⎡⎤=⎢⎥⎣⎦。
1.函数文件prime.m
function prime(a)
if size(a)~=1|round(a)~=a %判断输入的变量是否为一个整数标量
error('The input argument must be a interger number')
end
for i=2:sqrt(a) %判断a是否能被2到(a-1)之中的任一个数除尽
b=rem(a,i);
if b==0
disp(sprintf('%i is not a prime',a))
break;
end
end
if b~=0 %若循环完后,余数最终还不为零,则此数为素数
disp(sprintf('%i is a prime',a))
end
2.函数文件dele.m
function [remstr,charnum]=dele(a)
%只有ASCII码在32到126之间的整数所对应的符号才能被显示或打印出来,而且该程序只对标量或行、列向量进行操作
for i=1:length(a)
if a(i)<32 | a(i)>126| round(a(i))~=a(i) | any(ismember(size(a),1))==0
error('The input must be an interger array,whose element value is between 32 and 126');
end
end
b=[];
for i=1:length(a)
if a(i)~=32
b=[b,a(i)];
end
end
remstr=char(b);
charnum=length(b);
3.函数文件zeronum.m统计一个数值中的0的个数
function c=zeronum(a)
if size(a)~=1
error('The input argument must be a scalar')
end
b=num2str(a); %提问:为什么要这一步?
c=0;
for i=1:length(b)
if b(i)=='0' %先给不加引号,保存程序后,在命令行用zeronum(700)测试,
%结果为何错误
c=c+1;
end
end
脚本文件zn.m统计1到1999中0的总个数
zn=0;
for i=1:1999
zn=zn+zeronum(i);
end
disp(sprintf('1到1999中0的总个数为%i',zn))
4.函数文件equaroot.m
function equaroot(a,b,c)
%计算一元二次方程y=a*x^2+b*x+c的根,Y=EQUAROOT(A,B,C) det=b^2-4*a*c
if det>0
y(1)=(-b+sqrt(det))/2*a;
y(2)=(-b-sqrt(det))/2*a;
elseif det==0
y=-b/2*a;
else
y(1)=(-b+i*sqrt(det))/2*a;
y(2)=(-b-i*sqrt(det))/2*a;
end
disp('The roots of the equation are ')
disp(y)
5.函数segfun.m用于计算
function y=segfun(x)
if x>3 | x<-3
error('The input values is between -3 and 3')
end
if x>=-3 & x<-1
c=(-x.^2-4*x-3)/2;
elseif x>=-1 & x<1
c=-x.^2+1;
else
c=(-x.^2+4*x-3)/2;
end
y=c;
脚本文件plotsegfun.m用于画图
a1=[-3:0.01:-1];
plot(a1,segfun(a1),'r.-')
hold on
a2=[-1:0.01:1];
plot(a2,segfun(a2),'b-')
hold on
a3=[1:0.01:3];
plot(a3,segfun(a3),'go')
6.脚本文件menuch.m
ch=menu('请选择参数产生一个3阶方阵','[-10,10]之间均匀分布的随机阵','[-5,5]之间均匀分布的随机阵','[-1,1]之间均匀分布的随机阵','标准正态分布的随机阵')
switch ch
case 1
a= 10-2*10*rand(3)
case 2
a=5-2*5*rand(3)
case 3
a= 1-2*1*rand(3)
case 4
a=randn(3)
end
7.function mark
grade=input('note:成绩矩阵的每一行对应着一个学生的6门课成绩\n请输入成绩');
r=2;
while r==2
disp('您确定吗?')
r=menu('','yes','no','abort');
switch r
case 1
disp('确定'),break
case 2
disp('不确定'),grade=input('请重新输入成绩:')
case 3
return
end
end
[m,n]=size(grade); %m为学生人数
w=[2,3,2,4,2.5,1];
for i=1:m
grademean(i)=sum(w.*grade(i,:))/sum(w);
end
disp(sprintf('这%i位同学的加权平均成绩为',m))%如果不加disp,那结果将显示什么?
disp(grademean)
8.函数文件bonus.m
function y=bonus(I)
for i=1:length(I)
if I(i)>40
d(i)=(I(i)-40)*0.01+20*0.02+10*0.05+10*0.1;
elseif I(i)>20
d(i)=(I(i)-20)*0.02+10*0.05+10*0.1;
elseif I>10
d(i)=(I(i)-10)*0.05+10*0.1;
else d(i)=I(i)*0.1;
end
y(i)=d(i);
end
9.脚本文件fracsum.m
n=15;%定义了n以便以后修改
%为各项阵列与分配空间
deno=zeros(1,n);%demo为分母
numer=zeros(1,n);%numer为分子
frac=zeros(1,n);%frac为各项分数
sum=zeros(1,n);%sum为he
%定义各项初始值
deno(1)=1;
numer(1)=2;
frac(1)=numer(1)/deno(1);
sum(1)=frac(1);
%计算各项
for i=2:n
numer(i)=deno(i-1)+numer(i-1)
deno(i)=numer(i-1)
frac(i)=numer(i)/deno(i)
sum(i)=sum(i-1)+frac(i)
end
sum(n)
检验时,在命令行输入format rat,frac;
再通过format恢复默认格式。
10.计算出圈顺序shushu.m
function b=shushu(n,m)
a=ones(1,n);
b=zeros(1,n);
i=0;j=0;k=0;
flag=0;
while flag~=1
i=mod(i,n)+1;
j=j+a(i);
if j~=0 & mod(j,m)==0
k=k+1;
b(k)=i;
a(i)=0;
if k<n
j=0;
else
flag=1; end
end
end。