Charlotte324 / matlab-programming-and-numerical-method

1 stars 0 forks source link

基础 #1

Open Charlotte324 opened 1 year ago

Charlotte324 commented 1 year ago

基础

内容来自21年的hyt口述

链接基本上来自[mathwork](https://ww2.mathworks.cn/help/matlab/math/basic-matrix-operations.html)

打开编辑器

edit
% 然后按回车就能出现

注释

注释是%

Ctrl+R %将该行变为注释
Ctrl+T %取消注释
ctrl+i %自动整理代码

界面

Clear all %清除工作区的变量(赋值情况)
Clc %清除命令行窗口里面的历史
Ctrn+N %新建一个untitled

运行

F9 %选中然后按Fn+F9

输出

disp(x) %输出x

变量名称

数运算

%交换a,b的值:
c=a;
a=b;
b=c

创建矩阵

同行用逗号或者空格隔开;不同行用分号隔开

a=[1,2,3,4,5]
b=[2,3,4;5,6,7]
a=[1 2 3 4 5]

方括号是赋值用的,小括号是引用用的

冒号的用法:

a:b

[a,a+1,a+2,...,b]

C=1:2:9
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[1,3,5,7,9]
等差数列,从1到9,每隔两个

zeros()

A=zeros(4) %4X4全零矩阵 行向量
A=zeros(2,6) %2X6全零矩阵 2行6列 行向量
B=zeros(5,5,3) %矩阵也可以是三维的,用B(:,:,1) ,B(:,:,2) ,B(:,:,3) 三个层次,每个层次是5X5全零矩阵
A=ones(4) %4X4全一矩阵 行向量
A=eye(4) %单位方阵赋值函数,一个对角线是1,其他是0

生成含随机数的矩阵

随机数函数rand() randn() randi()

r=rand(1) 
%随机生成一个介于0到1的函数,每个数出现的概率是等可能的
%%%%%%%%%%%%%%%%%%%
r =

    0.8147

B=zeros(5,5,3)
B(:,:,1)=rand(5,5) 
%生成一个5X5的矩阵,每个数取值在0-1;通过倍乘和加法,可以将0-1扩展成任意范围
%先生成那种空的矩阵,再往里面填数
%%%%%%%%%%%%%%%%%%%
B(:,:,1) =

    0.1270    0.5469    0.9572    0.9157    0.8491
    0.9134    0.9575    0.4854    0.7922    0.9340
    0.6324    0.9649    0.8003    0.9595    0.6787
    0.0975    0.1576    0.1419    0.6557    0.7577
    0.2785    0.9706    0.4218    0.0357    0.7431

B(:,:,2) =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

B(:,:,3) =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

F=randn() %生成一个以零为轴,方差为1的正态分布(标准正态分布)的随机数
randi(m,5,5) %首位m表示1-m间的随机整数 5X5 i可能是Integral叭
randi([4,10],5,6) %首位表示生成4-10间的随机整数 5X5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ans =

     7     8    10     4     9     5
     5     9     5     7     9     9
     8     7     9     4    10     7
     5     4     7    10     4    10
     8     5    10     4     6     5

复读机函数repmat()

a=[1,2,3]
d=repmat(a,2,3) %把a当成一个矩阵里面的元素,赋到2X3的矩阵里
%%%%%%%%%%%%%%%
d =

     1     2     3     1     2     3     1     2     3
     1     2     3     1     2     3     1     2     3

矩阵中的元素调用

使用小括号调用。a() 。数组逻辑必须从1开始,而不是从0开始。

行向量中的数索引(小括号)

一行的矩阵可以用一个数字来索引它

a=[1,2,3]
a(1) 
%%%%%%%%%%%
ans =

     1

矩阵中的数索引

如果是AXB 的矩阵,可以从左到右,从上到下索引;

根据行主元和列主元,可以分开数数。

a(1,3) %调出来a这个矩阵里面的第一行,第三列的数
k=a(1,2) %令k=在a(1,2)这个地方的值

多位矩阵中的矩阵索引(冒号)

[数组索引](https://ww2.mathworks.cn/help/matlab/math/array-indexing.html)

正常的行列

A(i,:) %第i行的全部元素
A(:,j) %第j列的全部元素
A(i:i+m,k:k+m) %第i~i+m行内且在第k~k+m列中的所有元素
A(i:i+m,:) %第i~i+m行的全部元素

A(:;1) %第一列
a([1,2],;) %把第一行和第二行单拎出来 [1,2]是把a(1,;)和a(2,;)合起来的结果
a([1,3],[1,3]) %把第一行、第三行和第一列、第三列提出,行列没有交叉的地方扔掉(生成一个2X2)
a(3,3)=3 %令矩阵a的第三行第三列赋为3 赋值 把后面的值赋给前面
a([1,3],[1,3])=[0,0;0,0]

三维矩阵降维

B=zeros(5,5,3)
B(:,:,1)=rand(5,5)
B(:,:,2) %把一个三维矩阵的第2层调出来
C=B(:,:,1) %令C等于B的第二层(C是二维矩阵;不需要先定义C的大小)

矩阵的属性

长宽高

length(B) %输出长宽高里最大的那个值,一个整数
size(B) %依次输出三个维度的大小(长,宽,高)

矩阵运算

加减

一样大小的才能加

乘除

a*b %真·矩阵乘法
b’ %矩阵转置
a.*b %点乘-对应位置相乘
a/b %a乘以b的逆, 即=a*inv(b)
inv(b) %输出b的逆
a./b %点除-对应位置相除

元胞数组

[元胞数组](https://ww2.mathworks.cn/help/matlab/ref/cell.html)

C=cell(2,3) %元胞数据组 两行三列
%原胞数据组可以每个位置的数据的种类不一样,可以是数,文本,矩阵,元胞数据组里面的东西会用{}包住
C{1,3}=eye(3) %生成一个一行三列的元胞数组,令第三个值为3X3的单位矩阵。
C{1,3}=2 %令第二个值为数字2(1X1)
%%%%%%%%%%%%%%%%%%%%%%%
C =

  1×3 cell 数组

    {0×0 double}    {[2]}    {3×3 double}

double 双精度浮点数(数据一般以16个字节存储,double是以32个字节存储的;二进制里double32位是准确的)

语句

一、程序内结构

逻辑语句

== >= ~= > <

1~=2 %1不等于2

逻辑判定式之间:

|| 或 ; && 与

| & 写一个也行,但是计算量大一些

二、流程控制

分号:写完一行的时候写一个分号,说明这个命令没写完(否则会直接输出值)

分号是区分两行的,用分号把两行放在一行也可以,比如a=b;b=c;

顺序结构

正常写

循环结构

1、for...end 结构

%例子:计算2^i的和,计算到n
sum=0;
n=10;
for i=1:10
    sum=sum+2^i;
end
disp(sum)

for后面跟i=某个向量,把这个向量里的值都带进去算一遍

for这个句子后面不用加分号,是一个固定的语法。

比如for i=1:9 相当于把i=1, i=2, i=3, ...i=9跑一下

i=1:2:9 相当于把i=1, i=3, i=5, i=7, i=9带进去过了一遍

后面的式子里没有i也行,就相当于运行了(i的值的个数)次

如果i是一个矩阵,只会跑这个矩阵的第一行(每行分别跑)

a=randi(5,2,2)
sum=0;
n=10;
for i=a
    sum=sum+i;
end
disp(sum)

%%%%%%%%%%%%%%%
a=[2,3;5,2]
sum=[5;7]

2、while...end 满足就跑一次

i=1;
while 2^i<100000 && 3^i<100000
    i=i+1
end
disp(i) %11

3、分支结构

switch...case..otherwise 结构

if..else... 结构(常用)

a=5 %一个事实
if a==1
    b=1
elseif a==2
    b=2
elseif a==3
    b=3
else
    b=4
end
disp(b) %4

三、程序间结构

[脚本文件和函数文件](https://blog.csdn.net/xuxinrk/article/details/100923960)

[.m和.mlx](https://ww2.mathworks.cn/help/matlab/matlab_prog/what-is-a-live-script-or-function_zh_CN.html)

函数

包含:名称、输入值、算法、输出值

先创建一个文件夹,在下面分别有两个.m文件,一个是add.m,一个是code.m

%%%%%%%%%add.m
function sum=add(a,b,c)
       sum=a+b+c
end

%%%%%%%%%%code.m
a=2;
b=4;
c=6;
d=add(a,b,c)
disp(d) %12

这个里面的参数:a,b,c只在小函数中使用,称为形式变量,在大函数里面不能用。

把这个脚本保存到当前文件夹中,命名一定要是add(这个函数的名字)

之后就可以引用。

变量和指针

变量是指变量代表的数值,就是重新定义出一个a,b,c。a,b,c的名字不重要,只是中间变量。End之后它们就消失了。

[指针](https://blog.csdn.net/qq_49217297/article/details/119360681?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-119360681-blog-48829453.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-119360681-blog-48829453.pc_relevant_default&utm_relevant_index=2)调用了存储a,b,c的地方。

function add(a,b,c)
a=1;
b=2;
c=3;
end

%运行:
a=2;
b=4;
c=6;
add(a,b,c)
disp(c) %6
这时a,b,c不会被赋值成1,2,3(变量)
function add(*a, *b, *c)
*a=1;*b=2;*c=3
end

%这时运行code.m之后,a,b,c会被赋值成1,2,3,此时的a,b,c就是指针。(指针)