Bootstrap

Matlab学习笔记

针对“MATLAB教程_台大郭彦甫(14课)原视频补档”内容对matlab进行学习,补充记录自己从前没有注意的地方,以及放了一些练习题,后续学习笔记会在此补充。


一、学习笔记

1. e的指数函数

exp(x)用于生成e的指数函数在这里插入图片描述
答案:exp(sin(10))

2. clear的重要性

cos='this string.';
cos(8)
% >>输出 'r',将cos定义为字符
clear cos
cos(8)
% 清除cos函数定义,回归matlab原始定义
% >> -0.1455

3. 分号

指令后面用分号代表不显示命令结果,简洁画面

4. 指令

clc: clear command window display 消除命令行
clear: remove all variables in the workspace
who: variables in the workspace
whos: variable information of the workspace

5. 括号

小括号()用于引用数组元素
中括号[]用于存储矩阵和向量
大括号{}用于cell型数组的分配和引用

  • 示例1:
    在这里插入图片描述
    A([1 3], [1 3])
    第一个[1 3]代表行,指第一行和第三行(蓝框)
    第二个[1 3]代表列,指第一列和第三列(红框)
    结果取交集
    输出结果为
    在这里插入图片描述
  • 示例2
    A([2,3])
    输出结果ans= 5 31
    说明:对a数组中的第2、3位元素进行引用,使用()表示数组引用,而[]表示引用目标为数组。
  • 示例3
    将右上角四个数字变为0在这里插入图片描述
    使用示例1的方法,取第1 2行和第2 3列的交集即可得到
 A([1,2],[2,3])=0 %直接全部赋值为0
 A([1,2],[2,3])=[0 0; 0 0] %对各个位置设值
  • 示例4
    去掉一行,A(3,:)=[]去掉第三行,等号后面用[]即消去

A()=[] % 删除A的某行某列

6. 四则运算

加 减 乘 除 幂 点运算 转置:+ - * / ^ . '
A/B≈A*inv(B)

  • 示例
    在这里插入图片描述

x1=A+a %矩阵值与实数a直接相加
x2=A/a %由于a是实数,因此x2和x3一样
x3=A./a
x4=A^a %a=2,因此就是AA=A^2,矩阵的平方
x5=A.^a %矩阵数值的平方
C=A’ %矩阵的转置
y1=A+B
y2=A
B
y3=A.B
y4=A/B %y4=A
inv(B)
y5=A./B

在这里插入图片描述

除法运算中容易出现小数,因此可以使用’floor’,‘ceil’,‘round’,'fix’等参数进行目标整数取值,分别对应向下取整,向上取整,四舍五入,舍去小数。
精度则需要采用single、double等函数进行。

7. 常用函数

linspace() 向量
eye(n) 单位矩阵(对角线为1)
zeros(n1,n2) 全0
ones(n1,n2) 全1
diag() 对角线矩阵,其他为0
rand()

8. 矩阵相关函数

  • 示例
    在这里插入图片描述

max(A) %以每列为依据,找出每列的最大值
max(max(A)) %找出每列最大值的最大值,也就是矩阵的最大值
min(A)
sum(A) %得到每列的和
mean(A) %得到各列平均值
sort(A) %各列进行排序
sortrows(A) %对第一列的大小,携带整行进行排序
size(A) %得到m,n,即行列的个数,

[r,c]=size(A),当有两个输出参数时,size函数将矩阵的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
size(A,n)如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的时矩阵A的行数,c=size(A,2),该语句返回的时矩阵A的列数
length(A) %返回矩阵中行数和列数的较大值
find(A) %find(A==5)结果是第几个位置为5,一维的序列号

9. 记录matlab命令执行时间

tic toc用于记录命令执行时间,单位秒
tic用于保存当前时间,tic用于记录程序完成时间

tic %开始时间
operations %撰写程序代码
toc %结束时间

10. 预宣告pre-allocating

在执行程序时,实现设计好数组存放的空间,比生成数组后再生成空间要快

11. 函数function说明

在这里插入图片描述

  • 习题:设计一个函数,输入华氏度转化为摄氏度
function C = F2C()

while 1
    F = input('Temperature in F: ');
    if isempty(F) == 1
% isempty确定数组是否为空,TF = isempty(A),如果A为空,TF = isempty(A) 返回逻辑值1,否则返回逻辑值0
        disp('Bye');
        break;
    else
        C = (F-32)/1.8;
        disp(['==>Temperature in C =',num2str(C,'%.2f'),'.']);
    end
end
% disp使用[]运算符将多个字符向量串联在一起,当然也可以使用sprintf、fprintf等函数实现
% 如果用disp输出一个计算值,需要使用num2str,将数值转化为字符,如果直接输出变量值则会显示对应ASCII码
% num2str(x,'%.2f')显示为指定精度的浮点数

对应效果:
在这里插入图片描述

另:f(x)的表示 function handle

f = @(x) exp(-2*x);
% 代表f函数,f(x)=e^-2x
% 在workspace中f的value为等号后面的@(x)exp(-2*x)
x = 0:0.1:2;
plot(x, f(x));

12. 字符串逆序输出

使用reverse(s)反转s中字符的顺序

  • 示例 将s1= ‘I like the letter E’,变为s2= ‘E rettel eht elil I’
    s1=‘I like the letter E’;
    s2 = s1(size(s1,2): -1:1)
    %或 s2 = s1(length(s1): -1:1)
    %以上两种方法意思差不多,先取s1的列数或长度,减去一,从这个数开始,产生递减的数组。(一维数组列数=长度)
    %或 reverse(s1)
    % reverse - 反转字符串中的字符顺序
    %或 flip(s1)
    % B = flip(A),返回的数组 B 具有与 A 相同的大小,但元素顺序已反转。B 中重新排序的维度取决于 A 的形状,例如,如果 A 为向量,flip(A) 将沿向量的长度方向反转元素顺序;如果 A 为矩阵,flip(A,1) 将反转每一列中的元素,flip(A,2) 将反转每一行中的元素;如果 A 为 N 维数组,flip(A) 将按 A 的大小值不等于 1 的首个维度上进行运算。

13. 结构体structure

fieldnames(str) 显示str结构体中的所有元素名
rmfield(str,‘元素名’) 删除结构体中某元素
cell2struct 将单元格数组转换为结构数组
orderfield 结构数组的顺序字段
setfield 给结构数组字段赋值
struct 创建结构数组

14. 三维,cat串联数组

在这里插入图片描述

15. 保存mat文件

save mydata1.mat 保存为mat文件,经过matlab压缩,其他软件读取会乱码

save mydata2.mat -ascii 保存为其他文件可读形式

16. excel互操作

在这里插入图片描述

17. 文件读取

在这里插入图片描述
在这里插入图片描述

fid=fopen('asciiData.txt','r');
i=1;
while ~feof(fid) %feof没到结尾会返回0
    name(i,:)=fscanf(fid,'%5c',1);
    %name(i,:) :读取出来的是单个的char,所以需要所有的列来储存
    %右侧代表读取一个值(段),这个段是5个字符
    year(i,:)=fscanf(fid,'%d',1);
    no1(i)=fscanf(fid,'%d',1);
    no2(i)=fscanf(fid,'%d',1);
    no3(i)=fscanf(fid,'%g',1);
    no4(i)=fscanf(fid,'%g\n');
    i=i+1;
end
fclose(fid); 
% 作者:给小GO捞黄瓜 https://www.bilibili.com/read/cv16173360/

18. 初阶绘图

可以新建实施绘图脚本,撰写基本绘图代码运行生成图片后,对图片进行编辑,更新实时代码。

  • 练习
    在这里插入图片描述
t = linspace(1,2); % 设置自变量范围 生成1-2之间的100个等间距点的行向量
a = t.^2; % 注意点乘
b = sin(2*pi*t);
plot(t,a,'k-',t,b,'ro');
h = plot(t,a,'k-',t,b,'ro');% 设置句柄
legend('t^{2}','sin(2\pit)','Location','northwest'); % 注意使用latex形式表达
title('Mini Assignment #1')
xlabel('Time (ms)')
ylabel('f(t)')
set(gca, 'FontSize',12); % 坐标轴变大
set(h, 'LineWidth', 2); % 线变粗
set(h, 'MarkerFaceColor','m'); % 填充颜色为粉色

在这里插入图片描述

注意:
gca和gcf只能指到最近的图
subplot在一个界面画多个图

在这里插入图片描述
可以通过调整坐标轴,使同一个图看上去有所不同
axis normal:默认情况,可以与tight结合在一起用
axis equal 使xy轴大小一致
axis square x整体长度等于y整体长度,产生正方形坐标系(默认为矩形),刻度范围不一定一样,但是一定是方形的。
axis square tight 贴近取值范围边缘画坐标轴

19. log绘图

绘制semilog图要绘制网格
在这里插入图片描述
在这里插入图片描述

20. 柱状图

Histogram查看整体情况,hist()函数
Bar Charts分类变量

histogram的横坐标是连续变量,将连续变量分成固定的组,组别之间是固定不变的。例如:
横坐标:1-10, 11-20, 21-30, 31-40. (横坐标无法改变顺序)
纵坐标:每组的频次 或者 比例

bar chart的横坐标为分类变量,例如:
横坐标:去学校的各种交通方式,走路,骑车,打车,开车 (横坐标无先后顺序 可自由调整)
纵坐标:每种交通方式的频次 或者 比例

%% bar charts分类变量
x = [1 2 5 4 8];
y = [x;1:5]; % 二行五列矩阵
subplot(1,3,1);
bar(x);
title('A bargraph of vector x');
subplot(1,3,2);
bar(y);
title('A bargraph of vector y');
subplot(1,3,3);
bar3(y); % 绘制三维条形图
title('A 3D bargraph');

在这里插入图片描述

barh(…,style) 指定条形的样式
默认为grouped,需要堆叠的话,将style定义为stacked的即可
在这里插入图片描述

21. 极坐标

%% polar 极坐标图,确认角度和半径即可
x = 1:100;
theta = x/10; % 弧度角,点到原点的角度
r = log10(x); % 每个点离原点的距离
subplot(1,5,1); % 绘图
polar(theta, r); % 指令

theta = linspace(0, 2 * pi); 
r = cos(4 * theta);
subplot(1,5,2);
polar(theta, r);  
% 绘制五边形
theta = linspace(0, 2 * pi, 6); % 角度五等分
r = ones(1, length(theta));
subplot(1,5,3); 
polar(theta, r);

theta = linspace(0, 2 * pi); 
r = 1 - sin(theta);
subplot(1,5,4); 
polar(theta, r);

% 绘制六边形
theta = linspace(0, 2 * pi, 7);
r = ones(1, length(theta));
subplot(1,5,5);
polar(theta, r);

在这里插入图片描述

22. 阶梯图

stair 阶梯图(左)
stem 绘制离散序列数据(右)
在这里插入图片描述

%% 
clear ,clc
t = linspace(0, 10, 1001); % 为什么要取样1001,最低抽样频率10hz
y = sin(pi*t.^2/4);
hold on
plot(t, y)
%stem(t(1:floor(size(t,2)/50):size(t,2)), y(1:floor(size(t,2)/50):size(t,2)))
stem(t(1:floor(length(t)/50):length(t)), y(1:floor(length(t)/50):length(t)))
% 设定取值范围,每隔50个点的离散点
hold off

%% 另一方法
%% 
t = [0:0.2:10];
f = sin((pi * t .^ 2) ./ 4);
h = stem(t, f, '-r');
set(h, 'markerEdgecolor', 'red');
hold on
t2 = [0:0.01:10];
f2 = sin((pi * t2 .^ 2) ./ 4);
plot(t2, f2, 'b');
yticks([-1:0.5:1]);

23. 置信区间

%% 置信区间,误差上下限
x = 0: pi/10: pi;
y = sin(x);
e = std(y) * ones(size(x));
errorbar(x,y,e);

在这里插入图片描述

24. fill

fill() 在一个封闭的区间,涂满颜色

练习
在这里插入图片描述

25. parfor函数

parfor就是paralle+for,也就是并行的for循环。
matlab会弄出几个虚拟的小pc,一个算i=1:30部分循环,一个算i=50:80部分循环,再来一个算i=90:120部分循环,matlab将一个大循环分成小块,然后这些小块并行计算,最后再合在一起。
因为普通的循环是从i=1算到i=100,一个接一个算,如果下一次循环要依赖上一次循环怎么办?如果出现这种情况,那就不能用matlab的parfor了。
用parfor的前提条件就是,循环的每次迭代独立,不相互依赖。

https://blog.csdn.net/majinlei121/article/details/50460953

补:一些小技巧

1、当运行程序左下角busy忙碌时,ctrl+c可以跳出
2、…换行,前面要加空格才能用
3、当进行普通应用问题计算时,注意点乘的使用,否则使用向量的方式计算多个数容易出现错误

function x = freebody(x0, y0, t)
% 根据加速度求位移
x = x0 + v0 .* t + 1/2 * 9.8 * t .* t;

>> freebody([0 1],[0 1],[10 20])
% 这样可以得到两种情况的值,即0 0 10与1 1 20情况下的位移,而当function中的点乘变成乘号,没有点,则会显示矩阵维度错误

二、常用

常用名

ans
i,j:复数
Inf:无穷
eps:2.2204e-16计算机的最小数,数量级为10^-16
NaN:not a number
pi:Π

有理数

用分数进行显示和表示
format rat % rat 代表有理数
3/13
ans=3/13

  • 习题:用分数和小数计算在这里插入图片描述
format rat %进行分数表示
3/13+4/14+5/15
>> ans=
     232/273  
format long %进行小数表示
3/13+4/14+5/15
>> ans =
   0.849816849816850

三、英文学习

arithmetic n.算术
trigonometry n.三角学
exponents and logarithms 指数与对数
complex numbers 复数
cartesian coordinate system conversion
cartesian adj.笛卡尔的
coordinate n.坐标,v.使协调
conversion n.转变变化
embeded v.使嵌入,栽种给,深留脑中
colon operator 冒号运算符
semicolon n.分号
matrix n.矩阵
script n.脚本

四、存疑部分

在这里插入图片描述
在这里插入图片描述

function [volume]=pillar(Do,Di,height)
if nargin==2, % 输入了两个参数时,设置height大小为1
    height=1;
end
volume=abs(Do.^2-Di.^2).*height*pi/4;
%命令行窗口
>> pillar(1,1)
ans =     0
>> pillar(2,1)
ans =    2.3562
;