02-结构化程式与自定义函数

视频教程:b站视频【MATLAB教程_台大郭彦甫(14课)原视频补档】https://www.bilibili.com/video/BV1GJ41137UH/?share_source=copy_web&vd_sourc*e=d6b9f96888e9c85118cb40c164875dfc
官网教程:

  • MATLAB 快速入门 - MathWorks 中国

参考博客

  • MATLAB(二)结构化程式与自定义函数
  • 【台大郭彦甫】Matlab入门教程超详细学习笔记三:结构化程式与自定义函数(附PPT链接)

声明:自己跟着敲了一遍,仅供个人参考学习。
软件版本:MATLAB R2016b


脚本编辑器

新建脚本-运行

新建一个脚本文件(我的命名M02_01.m),文件保存命名不能以数字开头,用字母开头,字母大小写有区别

我习惯路径都为英文,关键字命名后面可以加条下划线,如for_.m

1712026136463.png

for i=1:10x=linspace(0,10,101);plot(x,sin(x+i));print(gcf,'-deps',strcat('plot',num2str(i),'.ps'));
end

遇坑:按运行出现弹框

1712026274242.png
我搜了一下,大概原因是:
:::tips
如果我们新建一个.m文件,习惯性保存在默认文件夹,但是没有先重新从进入默认文件夹,再打开我们新建的文件,那么MATLAB就还没有反应过来我们已经将新建的文件保存到了默认文件夹,从而误认为文件不在默认文件夹下,进而在我们运行文件时还是会报错,因为MATLAB没反应过来。
参考博客MATLAB“在当前文件夹或MATLAB路径中未找到文件“的小“坑”
:::

做法:先打开浏览文件夹,再从左侧的结构树上找到该.m文件(该文件夹下的),并打开它,再运行就不报错。
1712027609969.png
1712026533972.png

常用功能

  • 注释 ctrl+R
  • 取消注释 ctrl+T
  • 注释换行 ctrl+J
  • 智能缩进 ctrl+I


语法

关系逻辑(操作)符

条件语句

if-elseif-else 语句

if-else
% Generate a random number
a = randi(100, 1);% If it is even, divide by 2
if rem(a, 2) == 0disp('a is enen')b = a/2;disp(b)
elsedisp('a is old')b = a/2;disp(b) 
end

1712031968115.png

if-elseif-else

多个条件

% Generate a random number
a = randi(100, 1);
disp(a) if a < 30disp('small')
elseif a < 80  % 30 <= a <80disp('medium')
else disp('large')
end

1712032407945.png

switch语句


1712029167657.png

% input_num=1;%可以修改
input_num=0;
% input_num=-1;switch input_numcase -1disp('negative 1');case 0disp('zero');case 1disp('positive 1');otherwisedisp('other value');
end

1712029147299.png

循环语句

for循环语句

1712028121820.png

for n=1:10a(n)=2^n;
end
disp(a)

1712035166195.png

while循环语句

1712028097016(1).png
1e100=1x10^100
prod(1:n)=n!

n = 1;
while prod(1:n) <1e100 % prod(1:n)=n!n = n+1;
end
disp(n) % 得到的结果n-1是小于1e100的最大的阶乘数

1712035454139.png

练习

  1. 使用while循环来计算序列的总和1+2+3+…+999
% 初始化
n = 1;
sum = 0;% while循环
while n < 1000
%     disp(n) %打印循环次数sum = n+sum;n = n+1;
%     disp(sum)%打印每次循环得到的结果
end
disp(sum) %打印结果

1712450346760.png

  1. 用for循环做一遍上题。
% 初始化
n = 1;
sum = 0;% for循环
for n = 1:999sum = n + sum;n = n+1;
end
disp(sum) %打印结果

结果同上。

预分配

参考官网https://ww2.mathworks.cn/help/matlab/matlab_prog/preallocating-arrays.html

  • 如果未预分配空间,matlab每次经过 for 和 while 循环时,会在每次迭代时调整其大小,会比较费时间
  • 若一个变量所需要的内存空间是一个可预测的定值,我们应尽量提前为其分配内存空间。

对要初始化的数组类型使用适当的预分配函数:

  • 对于数值数组,使用 zeros
  • 对于字符串数组,使用 strings
  • 对于元胞数组,使用 cell
  • 对于表数组,使用 table

示例

  • tic-toc可以用于计时。

1712451112009.png
1712451185713.png
运行效果:

tic
x = 0;
for k = 2:100000x(k) = x(k-1) +5;
end
toc%%
tic
x = zeros(1,1000000);
for k = 2:100000x(k) = x(k-1) +5;
end
toc

1712451383135.png

练习


分析:

  1. 首先找到矩阵A中的所有负数;
  2. 把它们存在矩阵B中;
  3. 把这些负数变为0.

结果图:
1712454252975.png

方法1

注:体会一下第9、10行不加分号与加分号打印的结果。
其实发现不加分号打印的是循环的结果,加了分号用disp()打印的是最终结果。

%方法1
%% 1、不加分号
A = [0 -1 4; 9 -14 25; -34 49 64]B=zeros(size(A)); % size(A)同时求矩阵的行和列数
for i = 1:size(A,1) % size(A,1)求矩阵的行数for j = 1:size(A,2) % size(A,2)求矩阵的列数if(A(i,j))<0 B(i,j)=1 % 把负数放到矩阵B,负数变为1A(i,j)=0 % 把矩阵A中的1全部置零endend
end%% 2、加分号
A = [0 -1 4; 9 -14 25; -34 49 64]B=zeros(size(A)); % size(A)同时求矩阵的行和列数
for i = 1:size(A,1) % size(A,1)求矩阵的行数for j = 1:size(A,2) % size(A,2)求矩阵的列数if(A(i,j))<0 B(i,j)=1; % 把负数放到矩阵B,负数变为1A(i,j)=0; % 把矩阵A中的1全部置零endend
end
disp(B) % 打印矩阵B
disp(A) % 打印最后的矩阵A

打印结果:

  • 不加分号
>> exe1A =0    -1     49   -14    25-34    49    64B =0     1     00     0     00     0     0A =0     0     49   -14    25-34    49    64B =0     1     00     1     00     0     0A =0     0     49     0    25-34    49    64B =0     1     00     1     01     0     0A =0     0     49     0    250    49    64
  • 加分号
>> exe1A =0    -1     49   -14    25-34    49    640     1     00     1     01     0     00     0     49     0    250    49    64
方法2
%方法2
A = [0 -1 4; 9 -14 25; -34 49 64]
B = A < 0 % 返回一个零一矩阵,数组A中小于0的位置为1
A(B) = 0 % A(B) = X(未知)      X : 与 B 大小一样(行数和列数相等)

打印结果:

>> exe2A =0    -1     49   -14    25-34    49    64B =3×3 logical 数组0   1   00   1   01   0   0A =0     0     49     0    250    49    64

break

break作用:终止执行 for 或 while 循环。

参考官网https://ww2.mathworks.cn/help/matlab/ref/break.html?searchHighlight=break&s_tid=srchtitle_support_results_1_break

limit = 0.8;
s = 0;while 1tmp = rand; %随机数if tmp > limitbreak ends = s + tmp; 
end
disp(s)

技巧

  1. clear all 清除工作区内存中的变量
  2. close all关闭之前程序绘制的图像
  3. clc 清空之前程序在终端的输出
  4. 在命令末尾使用分号;来抑制输出(就是终端不能直接打印结果)
  5. 省略号可以将多行语句拼接为一行,灵活使用该语句可以提高代码可读性
%%
A = [1 2 3 4 5 6; ...6 5 4 3 2 1]%%等价于
A = [1 2 3 4 5 6; 6 5 4 3 2 1]

1712471583949.png

  1. Ctrl+C提前结束运行

自定义函数

查看内置函数

在命令行窗口输入edit(which('mean.m'))可以调出内置函数mean.m,如下图所示:
1712472357953.png

参考官网https://ww2.mathworks.cn/help/matlab/ref/function.html
1712472715644.png
说明:

  • 关键字: function … end 结尾
  • 函数保存的.m文件,函数名必须和文件名一致;
  • 也可将临时使用的函数定义在脚本文件内,但需要定义在文件最后;
  • 输入 input();输出可以用 disp() 或者 fprintf()
  • 注意 matlab 中对于字符串均使用 ‘’ 而不是 “” ,fprintf() 中的内容使用 ''括起来。

function的编写

例1:自由落体

写一个函数,计算给定初始位移xo,初始速度vo,下落时间t的自由落体位移:
1712472953895.png
1712473067873.png
1712473552154.png

例2:具有多个输入和输出的函数

function [a F] = acc(v2,v1,t2,t1,m)
a = (v2-v1)./(t2-t1);
F = m.*a;

1712473878439.png

例3:从华氏温度转换到摄氏温度

1712474141950.png

华氏温度用F,摄氏温度用C。转换公式为:

在这里插入图片描述

%从华氏温度(F)转换到摄氏温度(C)
function F2C()
while 1F = input('请输入华氏温度:','s');F = str2num(F);if isempty(F)returnendC = (F-32)*5/9;disp(['摄氏温度为:',num2str(C)])
end

1712474796581.png

内置的函数参数

1712474063526.png

使用函数句柄形式定义函数

参考官网https://ww2.mathworks.cn/help/matlab/ref/function_handle.html
使用 @ 运算符创建一个函数句柄。
1712475250063.png
要求该匿名函数从 0 到 1 的积分,请将其句柄传递给 integral。

f = @(x) x.^3 + x.^2 + x + 1;
q = integral(f,0,1) %该匿名函数从 0 到 1 的积分

1712475379009.png
-END-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动手学深度学习】15_汉诺塔问题

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 汉诺塔&#xff08;To…

基于springboot实现高校学科竞赛平台系统项目【项目源码+论文说明】

基于springboot实现高校学科竞赛平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了高校学科竞赛平台的开发全过程。通过分析高校学科竞赛平台管理的不足&#xff0c;创建了一个计算机管理高校学科竞…

day02 51单片机

51单片机学习 1闪烁LED 1.1 需求描述 这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。 1.2 硬件设计 1.1 软件设计 1)LED闪烁的代码 想让LED闪烁,就需要P00的值不断在0和1之间循环变化。实现这一功能的代码也很简单: #include <STC89C5xRC.H> //包含STC89…

超详细的 Python 文件操作知识!

python进行文件操作&#xff0c;在日常编程中是很常用的。为了方便大家&#xff0c;这里对各种文件操作的知识进行汇总。一文在手&#xff0c;无须它求&#xff01;来一起学习吧。 一、文件的打开和关闭 open()函数 f1 open(rd:\测试文件.txt, moder, encodingutf-8) conte…

《剑指 Offer》专项突破版 - 面试题 105 和 106 : 最大的岛屿和二分图(C++ 实现)

目录 面试题 105 : 最大的岛屿 面试题 106 : 二分图 面试题 105 : 最大的岛屿 题目&#xff1a; 海洋岛屿地图可以用由 0、1 组成的二维数组表示&#xff0c;水平或竖直方向相连的一组 1 表示一个岛屿&#xff0c;请计算最大的岛屿的面积&#xff08;即岛屿中 1 的数目&…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

【机器学习算法】决策树和随机森林在计算机视觉中的应用

前言 决策树和随机森林在计算机视觉中有着广泛的应用。决策树作为一种简单而强大的分类模型&#xff0c;可以用于图像分类、目标检测、特征提取等任务。它能够根据图像的特征逐层进行判断和分类&#xff0c;从而实现对图像数据的智能分析和理解。随机森林作为一种集成学习方法&…

[dvwa] CSRF

CSRF 0x01 low 跨站&#xff0c;输入密码和确认密码直接写在url中&#xff0c;将连接分享给目标&#xff0c;点击后修改密码 社工方式让目标点击短链接 伪造404页&#xff0c;在图片中写路径为payload&#xff0c;目标载入网页自动请求构造链接&#xff0c;目标被攻击 http…

【STL】栈(stack)

笔者在做下面这道题的时候想到用栈&#xff0c;但写的很麻烦 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define MAXC 255 typedef int SElemType; typedef struct StackNode {SElemType data;struct StackNode *next; }StackNode,*LinkStack; bool…

MathJax的基本使用

一、引言 MathJax引擎是一个开源的JavaScript库&#xff0c;它允许Web开发者在网页中嵌入高质量的数学公式。通过利用Web的最新技术&#xff0c;MathJax引擎可以解析LaTeX、MathML和AsciiMath等数学标记语言&#xff0c;并将其渲染为可视化的数学公式&#xff0c;这些公式可以…

NPU float(“inf“) mask_fill 出现NAN

使用NPU时&#xff0c;采用mask_fill函数&#xff0c;会出错&#xff1a; tensors.masked_fill(mask.unsqueeze(-1), float(inf)) 无法直接使用表达式,会报错 NAN&#xff1a; 取一个较大的值替换即可&#xff1b; tensors.masked_fill(mask.unsqueeze(-1), float(1e10))

LeetCode算法——双指针篇

宫侑的发球最终进化为三刀流&#xff0c;那么我的题解也未必要循规蹈矩! 1、验证回文串 题目描述&#xff1a; 解法&#xff1a; 这题官方给的关于双指针的题解都用到了多个库函数&#xff0c;如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )…

LeetCode——622设计循环队列

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/design-circular-queue/ 1.题目 设计你的循环队列实现。 循环队列是一…

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

Oracle ORA-28547:connection to server failed,probable Oracle Net admin error

使用Navicat连接oracle数据库时报ORA-28547错误 因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;需要去官网下载支持的版本。 1.去oracle下载对应的oci.dll文件 下载地址&#xff1a;Oracle Instant Client Downloads 可以用 11.2.0.4 2. 复制刚下载下来的instant…

【智能算法】小龙虾优化算法(COA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;Jia等人受到自然界小龙虾社会行为启发&#xff0c;提出了小龙虾优化算法&#xff08;Crayfsh Optimization Algorithm, COA&#xff09;。 2.算法原理 2.1算法思想 COA基于小龙…

计算机网络-TCP连接建立阶段错误应对机制

错误现象 丢包 网络问题&#xff1a;网络不稳定可能导致丢包&#xff0c;例如信号弱或干扰强。带宽限制可能导致路由器或交换机丢弃包&#xff0c;尤其是在高流量时段。网络拥塞时&#xff0c;多个数据流竞争有限的资源&#xff0c;也可能导致丢包。缓冲区溢出&#xff1a;TC…

网络安全之代码签名证书申请

代码签名&#xff0c;作为一种数字安全机制&#xff0c;对于软件开发、分发及用户使用环节具有至关重要的意义。以下从六大方面阐述代码签名必不可少的重要性&#xff1a; 确保代码来源可信&#xff1a; 代码签名如同软件的“身份证”&#xff0c;通过数字证书对开发者身份进…