一、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文本文件
fid=fopen('score.txt','r')
line1=fgetl(fid)
%數據按分割
%數據類型轉換
line2=fgetl(fid)
fclose(fid);
fid=fopen('score.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次
%%


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM