一、MATLAB之基础入门代码

序言

本篇旨在列出matlab入门及在科研中必须掌握的一些基础代码,主要内容包括:matkab矩阵运算、绘图、函数流程控制、文件、图像、函数等基本操作,以便于随查随用,至于常用的算法本篇鲜有涉及。。。

%% matlab总述
%  matlab中基本数据结构是矩阵,即使单独一个数也视为一个1*1的矩阵
%%

%% 矩阵创建&赋值操作
a=5;
b=[1 2 3];
c=[1;2;3];
d=[1 2 3;4 5 6;7 8 9];
x=[0:0.5:2]; % 0.5是步长
x=zeros(4); % 4*4零矩阵
x=zeros(2,3);% 2*3零矩阵
x=ones(5,5); % 1矩阵
x=eye(5); % 5阶单位阵,与Octave语法完全一致
[r,c]=size(x); % 返回x矩阵的大小
x=linspace(0,3,5); % 0到3间均匀生成5个点,生成函数的采样点
[x,y,z]=meshgrid([],[],[]); % 用以生成函数的采样点
%%

%% matlab中的保留字
pi
Inf % 无穷大
NaN % 未定式,0/0
%%


%% 数组计算
    a=a+b;a=a-b;% 数组加减
    a=b*c;a=b*inv(x)% 数组乘除 inverse
    a=b.*c;     % 对应位操作./  .*  .^
    a=a\';
    a=a(:);% 数组拉直
%%


%% 数组索引与操作
% 括号是索引符号,如([],[])
    x=a(2,2);
    x=a(5);
    x=a(1:2,3:4); %([],[])
    x(x>72)=x(x>72)-72 % 数组的逻辑索引,x>72自身就是一个0/1二维数组,x(x>72)就是访问对应为1位置处的值
% 数组赋值/改值
    a(2,2)=0
    a(5)=9
    a(1:2,3:4)=ones(2,2)
    a(1:2,[3,4,7,11])=ones(2,2) % matlab中[1:9],1:9是基本数据类型
%%

%% 数组的比较和逻辑运算,符合条件的同一位置为1,不符合则为0
x=[1 2 3 4 5 6 7];
y=[1 2 4 5 5 6 8];
eq=(x==y); %上面说过了,x==y自身也是一个0/1二维数组
eq=(x>2)&(y<5); % 与   &两边既可以是标量也可以是向量 VS. &&两边只能是标量
eq=(x>2)|(y<5); % 或
eq=xor(x>4,y<5); % 异或
x(x<3)=-1; % (x<3)是一个0/1数组,x(x<3)就是把(x<3)数组中1对应位置的位置访问,再将访问到的位置赋值1,比较和逻辑运算与数组索引结合
xy=[x,y]; xy=[x;y]; % 用已有数组构建新数组,数组融合
img=cat(3,R,G,B); % 高级数组融合
xy(:,xy(1,:)<4)=0 %逻辑运算结果矩阵也可以用来数组索引
%%

%% 数组操作函数
x=[1 2 3;4 5 6;7 8 9];
x=flipud(x);%上下转
x=fliplr(x);%左右转
x=rot90(x);%逆时针旋转90度
x=pinv(x);%数组求(伪)逆
sum(x,1); % x每列求和
sum(x,2); % x每行求和
sum(x(:)); % 求全和,:表示将数组拉直
maxn=max(x);% 返回每列最大值
maxn=max(x);% 返回每列最大值
[r,c]=max(x);% r是每列最大值,c是没行最大值
maxn=max(x(:)); % 返回全局最大值
min(); % 用法同max()
%%

%% 常用数学函数
%  注意matlab中矩阵是基本数据结构,因此所有函数都是对矩阵中每个x_i操作
y=sin(x);
y=abs(x);%绝对值
y=sqrt(x);%开方
y=ceil(x);%向上取整
y=floor(x);%向上取整
y=round(x);%四舍五入取整
y=rand(r,c);%生成随机矩阵
b=sum(a,idm);%求和函数,dim=1 表示对每一列求和,dim=2 表示对每一行求和
tabulate(detect_result)% detect_result是一个列向量,该函数用以频数、频率统计
%%
%% MATLAB函数基本语句
for i=1:2:100 %
end

while 1
    if a<1
        break
    end
end

function [output1,]=functionname(input1,) % 函数定义
command1
command2
output1=
%%

%% 基本绘图
%plot
x=0:0.001*pi:2*pi;
y=sin(x);
z=cos(x);
plot(x,y,\'-ob\',\'LineWidth\',1.5) % 标出数据点的折线图
hold on
plot(x,z,\'rs\') % 散点图 
drawnow % 动画图
xlabel(\'x\')
ylabel(\'y\')
title(\'图\')
axis equal % 两轴单位长度相等
axis([-2,2,-2,2]) % 控制坐标轴范围
set(gca,\'XTick\',0:pi/2:4*pi); % 设置坐标轴刻度间距,一般与下一行命令搭配
set(gca,\'XTickLabel\',{\'0\',\'0.5*pi\',\'pi\',\'1.5*pi\',\'2*pi\',\'2.5*pi\',\'3*pi\',\'3.5*pi\',\'4*pi\'})% 设置坐标轴刻度标号
xlim([-2,2]) % 控制坐标轴范围
text(0,0,\'(0,0)\') % 在数据曲线上点(x,y)处,标出\'(3,5)\'
legend(\'cos(x)\',\'sin(x)\',\'sin(x)-cos(x)\') % 依照绘图的顺序依次标注图例
saveas(gcf,strcat(\'ch\',num2str(i),\'.emf\')) % 保存plot图片,gcf是plot的句柄
plot(X)%绘制二维矩阵,以行号为横坐标,各列为纵坐标
plot(X);

% plot制作动图
for k=1:10
    plot (fft(eye(k+10))) % eye()单位阵,fft()傅里叶变换,plot()绘制矩阵
    axis equal
    M(k)=getframe; % 截取当前窗口作为影片帧
end
movie(M,50) %播放多帧图片,M 50次

%极坐标plar(theta,r,LineSpec)
t=0:0.1:3*pi;
polar(t,abs(cos(5*t)));

% 快速方程绘图
fplot(\'x-cos(x^2)\',[-4,4]);% 绘制y=x-cos(x^2)
ezplot(\'y-f(x),[-6 6 -8 8]\');% ezplot(\'方程式\',[xmin xmax ymin ymax])
ezplot(\'cos(3*t)\',\'sin(3*t)\',[0:2*pi]);% ezplot(\'x参数式\',\'y参数式\',[tmin,tmax])
%%

%% 参数方程作图(可以画出很有趣的非函数图像)
t=0:pi/50:2*pi;
x=sin(t);
y=cos(t);
plot(x,y)
axis([-1.1,1.1,-1.1,1.1])
axis equal
%%

%%
t=0:0.1*pi:20*pi
x=sin(t)
y=cos(t)
z=t
plot3(x,y,z) % 三维曲线参数方程作图
grid on % 开网格
%%

%%三维曲面
[x,y]=meshgrid(-pi:0.1:pi); % 画函数采样点
z=sin(x).*cos(y);
mesh(x,y,z) % 画三维曲面
figure() % 开新画板 
surf(x,y,z) % 画中间插值的三维曲面(有渲染效果)
%%


%% 文件数据读取
% .txt纯数据文件文件
data=load(\'c:\desktop\score.txt\')
% .txt文本文件
fscore.txt\',\'r\')
line1=fgetl(fid)
%数据按分割
%数据类型转换
line2=fgetl(fid)
fclose(fid);
fscore.txt\',\'w\')
fprintf(fid,\'会当凌绝顶’)
fprintf(fid,\'%d月工资  %6.1f\n\',[1,2,3,4;20000,19999,20010,25000,23000])
fclose(fid);

% excel文件
data=xlsread(\'filename.xls\',\'Sheet1\',\'A3:C6\');
data(isnan(data))=0;%空位补零
xlswrite(\'filename.xls\',{\'t\',\'w\'},\'Sheet1\',\'B1:C1\')

%图片文件
img=imread(\'leave.jpg\')% 图片读取
image(img) % 图片显示
lip(234:435,112:300,:)%图片切片
imshow(lip) % 图片显示
imwrite(img,\'c:\\desktop\\figure.emf\')
% UI交互式导入图片
[FileName PathName FilterIndex]=uigetfile({\'*.jpg\',\'*.bmf\'},\'请导入图片\',\'*.jpg\',\'MultiSelect\',\'on\')
if ~ FilterIndex
    return
end

%视频文件
data=VideoReader(\'sport.avi\')% data是一结构体
frame=read(data,25)% 读取视屏中的某一帧,即图片
imshow(frame)% 对视频处理就是循环处理每一帧
%%


%% 线性方程求解、拟合、回归
x=A\B
%一元线性拟合
x=[2.410 2.468 2.529 2.571 2.618 2.662 2.715 2.747  2.907 2.959 2.997];
y=[0     0.800 1.695 2.290 2.965 3.595 4.365 4.810  7.125 7.890 8.425];
a=polyfit(x,y,1)%一阶拟合 y=a1 x+ a2
y=polyval(a,x) % 获得拟合表达式

%自定义拟合
p=fittype(\'a*x+b*sin(x)+c\');% 指定拟合模型
f=fit(x,y,p)% 获得拟合函数,x和y必须为列向量
plot(f,x,y)% 画出拟合图

%差值 x=[1:10] y=[1:10],线性回归求xi对应的yi
yi=interp1(x,y,xi,\'linear\');
%线性回归 y=f(x1,x2,x3)
%%

%%微分方程求解 
%解析解
syms y(x);
ode=diff(y,x)-y==0;
init=y(0)==1;
dsolve(ode,init)
%dsolve(\'D2y+4*Dy+24*y=0\',\'y(0)=0,Dy(0)=15\',\'x\')
%尤克—库塔数值解???
%%

%% 符号运算
% 符号对象的创建,matlab中之前都是数值计算,这里是符号运算
a=sym([1/2 sqrt(5)]);
y=sym(\'2*sin(x)*cos(x)\');y=simple(y);

syms x y;
z=cos(x)*sin(y);
% 符号表达式及函数的创建, matlab默认是数值运算,符号运算需要提前声明。
syms n x T wc p;
f1=n*x^n/x;
f2=sym(log(T)^2*T+p);
f3=sym(\'w+sin(a*z)\');

% 将符号运算中的符号替换为数值 subs(s,old,new)
syms x y;
z=cos(x)*sin(y);
x=1;y=1;
ans=subs(z);
%%

%% MATLAB中自定义函数
FunctionName1.m  % 文件名必须与函数名保持一致
function ValueName=FunctionName1(parameter1,parameter2) %一个返回值=函数名(形参列表)
    .
    .
    .
ValueName= % 返回值=

>>[r1,r2]=FunctionName(parameter1,parameter2);
>>R=FunctionName(parameter1,parameter2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FunctionName2.m
function ValueName=FunctionName2(parameter1,parameter2)
    .
    .
    .
ValueName=

>>[r1,r2]=FunctionName(parameter1,parameter2);
>>R=FunctionName(parameter1,parameter2);
%%


%% MATLAB 动画 @2021.09.25
close all;clear all;clc

M = moviein(21);% 建立一个21列的大矩阵,每一列将用来存储动画的一帧

name={\'-1000.png\',\'-900.png\',\'-800.png\',\'-700.png\',\'-600.png\',...
      \'-500.png\',\'-400.png\',\'-300.png\',\'-200.png\',\'-100.png\',...
      \'0.png\',\'100.png\',\'200.png\',\'300.png\',\'400.png\',\'500.png\',...
      \'600.png\',\'700.png\',\'800.png\',\'900.png\',\'1000.png\'};

  for i=1:21 
      jpg=imread(name{i});
      figure(i);
      imshow(jpg);
      pause(0.01);
      title(name{i});
      axis equal;
      M(i)=getframe; % 抓帧
  end
movie(M,2); % 播放M,2次
%%