台大郭彦甫MATLAB学习笔记(Part1)

本文是台大郭彦甫的MATLAB教程P2~P4的学习笔记,包括代码和课后练习。

目录

一.基本操作与矩阵输入

1.简单习题

2.embedding functions(嵌入函数)

3.varibles(变量)

 4.format(格式)

 5.命令行终端

6.数组(向量和矩阵)

7.矩阵索引

 8.矩阵替换练习

 9.colon operator(冒号)

 10. Array Concatenation(数组连接)

 11.Array Manipulation(数组操作四则运算)

12.some special matrix(一些特殊矩阵)

13.some matrix related functions(一些矩阵相关函数)

二 结构化程式与自定义函数

1.MATLAB Script(matlab脚本)

2.script flow(脚本流程)

3.练习1~999连加

4. for循环

 5.pre-allocating space to variables(为变量预分配空间)

 6.练习 A转换为B矩阵

 7.break​编辑

 8.tips for script writing(写脚本技巧)

 9.scripts vs functions(脚本 vs 函数)​编辑

 10. user define functions(用户定义函数)

11.functions with multiple inputs and outputs(有多个输入和输出的函数)

 12.温度练习​编辑

 13. 函数默认变量

 14. function handles(函数句柄,类似c语言指针)

 三 变数(变量)档案存取

1 MATLAB data types

 2.类型转换​编辑

 3.字符串

 4.数组

 5.logical operations and assignments(逻辑运算和赋值)

 6.反转字符串练习

7.structure(结构体)

8.练习:找到Ann Lane的第三个成绩90.显然这个问题不难。

9.structure functions(结构体功能)

 10.nesting structure(嵌套结构)

 11.cell array(元组)使用大括号,有两种方式:

12. 练习创建一个B元组

 13. accessing cell array(获取元组)

 14.cell array functions(元组函数)

 15.multidimensional array

 16.reshape

 17.练习reshape

 18.检查状态

 19. file Access

 20.save() and load()

21.只存储某个特定变量

 22.excel file reading

 23. excel file writing

 24. Getting text in excel spreadsheet

 25.练习把score存到header中

 26.低阶文件输入/输出

 27.写sin数值

 28.读取文件


一.基本操作与矩阵输入

1.简单习题

1.
>> cos(((1+2+3+4)^3/5)^0.5)

ans =

   -0.0050


2.
>> sin(sqrt(pi))+log(tan(1))

ans =

    1.4228


3.
>> 2^(3.5*1.7)

ans =

   61.8199


4.
>> exp(sin(10))

ans =

    0.5804

2.embedding functions(嵌入函数)

公式太长可以使用变量存储一部分,然后运算。

>> cos(pi)

ans =

    -1

>> sin(ans)

ans =

   -0.8415

>> sin(cos(pi))

ans =

   -0.8415

3.varibles(变量)

①变量名称大小写有区别

②变量开头不可以有字母,非开头可以有数字。

 查看变量类型:双击工作区的变量,显示的类型。

 或者 whose(who查看现有变量,whos查看变量相关信息)

 特殊变量--关键字

 answer:答案,i.j:复数,inf:无限大,eps:很小的数,NaN:非数,pi:圆周率

 查看有哪些keywords

 函数转换为变量:对cos进行字符串赋值,输出对应的第八个字符。此时变量的优先级大于函数。

>> cos='This string.';
>> cos(8)

ans =

    'r'

消除变量,单个clear把工作区内容全部清空(谨慎清空)

 4.format(格式)

根据不同类型输出不同的小数长度

 long:很长,shortE、longE:科学符号(e+00是10的0次方),bank:两位小数点,hex:16进制,rat:转换为有理数

练习题:

不难,显然是1,d

 

 5.命令行终端

 代码后加分号不返回结果,按上箭头返回之前的指令

 clc:清空屏幕

6.数组(向量和矩阵)

行向量(空格间隔),列向量(分号间隔)。

a*b内积,b*a外积。

 输入一个矩阵,空格间隔,分号换行。

>> A=[1 21 6; 5 17 9; 31 2 7]

A =

     1    21     6
     5    17     9
    31     2     7

7.矩阵索引

输出行向量或者列向量,直接输出第几个就可以。

当想查看矩阵的数值时A(X,Y):A为矩阵,X为第X行,Y为第Y列,也就是第X行的第Y个。如果用A(X)查找,遵循从上到下从左到右原则,先查左边第一个列向量,再查左边第二个列向量。

依然输入以下5个指令,观察得到的结果。

 需要强调的是,第五个指令的第一个中括号代表的是行向量,第二个中括号代表的是列向量。也就是说:第一行和第三行、第一列和第三列的值,得出来的就是一个二阶矩阵。

 8.矩阵替换练习

解题思路:第二个矩阵很好替换,第三个矩阵博主用了上述方法快速的对四个值进行了替换。删除第三行只需要把第三行的值默认为空即可。

 9.colon operator(冒号)

 A=[j:i:k] j为起始值,i为等差,k为结尾数字。如果等差为1,省掉i即可。

 

其中,最后一个B的类型是double,str的类型是str

 

 10. Array Concatenation(数组连接)

F=[A B]是行不变,列增加。F=[A;B]是列不变,行增加。

 

 11.Array Manipulation(数组操作四则运算)

两个矩阵运算如下:

 

 矩阵和常数运算简单,不做赘述。其中A^a是A*A而非A.^a,A'是沿对角线交换,即为转置。

12.some special matrix(一些特殊矩阵)

linspace:均分计算指令。linspace(x,y,z)起始为x,终点为y,中间元素个数为z个。

eye(n):对角线为1的nxn矩阵。

zeros(n1.n2):元素全为0的n1xn2矩阵。

diag():对角线为已知数字的矩阵。

rand():随机矩阵。

13.some matrix related functions(一些矩阵相关函数)

max(A)查找A每一个列向量的最大值,返回的是一个行向量,min(A)、sum(A)、mean(A)同理。max(max(A))返回的是一个常数。

sort(A)针对每一个列向量进行排序,sortrows(A)每一行以第一个列向量的大小顺序变动.

size(A)就是n*n,length(A)是行向量和列向量哪个大就返回哪个数值。find(A==5),A第几个值为5.

二 结构化程式与自定义函数

1.MATLAB Script(matlab脚本)

撰写第一个sin绘制图的脚本,运行结果是一个动图。


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

matlab %是注释,%%是分节,讲解了简单的debug。script可以保存,命令行打完就不见了,建议用script。

2.script flow(脚本流程)

从上至下

 结构化编程技术(structured programming)

 不同是~=而非!=

 语法都需要配合结束指令

 在script运行右边代码,结果出现在命令行窗口。

a=3;
if rem(a,2)==0  %reminder余数
    disp('a is even')
else
    disp('a is odd')
end

input_num=1;
switch input_num
    case -1
        disp('negative 1')
    case 0 
        disp('zero')
    case 1 
        disp('positive 1')
    otherwise
        disp('other value')
end

 

n = 1;
while prod(1:n) < 1e100 % product阶乘 10的100次方
    n = n + 1;
end

3.练习1~999连加

n = 1;
sum = 0;
while n < 1000
    sum = sum + n;
    n = n + 1;
end
disp('1+2+3+...+999=')
disp(sum)

4. for循环

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

如果对某一个变量重新赋值要clear,如clear a

如果把n换成奇数,n=(1:2:10不行),因为这样n的偶数为都会变成0,而非不存在。

 5.pre-allocating space to variables(为变量预分配空间)

tic是计时开始,toc是计时结束

 使用%%运行两个程序,可以发现B程序预先分配节省了很多时间。

%%
tic
for ii = 1:2000
    for jj=1:2000
        A(ii,jj) = ii + jj;
    end
end
toc


%%
tic
A = zeros(2000, 2000);
for ii = 1:size(A:1)  %返回矩阵对应行数
    for jj = 1:size(A,2) %返回矩阵对应列数
        A(ii,jj) = ii +jj;
    end
end
toc

 6.练习 A转换为B矩阵

让矩阵B=矩阵A,并把B中的负数改为非负数。

A=zeros(3,3);
B=zeros(3,3);
A=[0 -1 4; 9 -14 25; -34 49 64];
B=A;
disp(B)
for n=(1:9)
    if B(n)<0
        B(n) = -B(n);
    end
end

disp(B)

 

 7.break

 8.tips for script writing(写脚本技巧)

执行程序前把变量、图片清除。clc是清屏。;不显示程序结果。…换行号(代码太长,下面行继续上行代码)。命令行ctrl+c停止程序。

 9.scripts vs functions(脚本 vs 函数)

 查看平均值内置函数


>> edit(which('mean.m'))
>> 

 10. user define functions(用户定义函数)

第一个函数——自由落体

在script保存函数(要用点乘,否则两组数组无法输出)

function x = freebody(x0, v0, t)
% calculation of free falling
% x0: initial displacement in m
% v0: initial velocity in m/sec
% t: the elapsed time in sec
% x: the depth of falling in m
x = x0 +v0.*t + 1/2*9.8*t.*t;

在命令行窗口输入

11.functions with multiple inputs and outputs(有多个输入和输出的函数)

 输出有多个的时候用[]。

 12.温度练习

 1.要求给出一个华氏温度,计算对应的摄氏温度。并显示摄氏温度,函数一直执行,直到输出不是数字。

这里提示一些容易犯错的点:①不需要写y=F2C否则回车之后还会输出ans,②用input录入输入值,③disp只能输出一个变量所以用数组[],④需要把摄氏度C转为字符串,使用num2str。

function F2C
n=1;
while n==1
    F= input('Temperature in F:');
    if isempty(F)
        break;
    else
        C = 5 .*(F-32)./9;
        disp(['==>Temperature in C:',num2str(C)])
        %disp(['==>Temperature in C:',num2str(C,'%.2f')]) %num2str数字转字符,%.2f小数点后两位
    end

end

 13. 函数默认变量

这里的意思是指:如果调用pillar只输入2个参数,那就默认height为1.nargin是实际输入变量个数的函数,varargin是可变输入参数列表。

 14. function handles(函数句柄,类似c语言指针)

 

 三 变数(变量)档案存取

1 MATLAB data types

 2.类型转换

 

 3.字符串

 unit16是转换成ASCII码。

 4.数组

 其中,s1和s2没办法组合成矩阵是因为维度不同。

 5.logical operations and assignments(逻辑运算和赋值)

对于额外的扩展题,最简便的方法应该是直接调用strcmp函数

 6.反转字符串练习

这里注意几点:①输入的s1要定义为字符型。

function reverse 
s1 = input('give a string:','s');
n = strlength(s1);
for i=1:n
    s2(n-i+1) = s1(i);
end
disp(char(s2));

7.structure(结构体)

>> student.name = 'John Doe';
student.id = '[email protected]';
student.number = 301073268;
student.grade = [100, 75, 73; ...
                 95, 91, 85.5;...
                 100, 98, 72];

student

 

 同学不止有一个,就用括号来存储。

>> student(2).name = 'Ann Lane';
student(2).id = '[email protected]';
student(2).number = 301078853;
student(2).grade = [95, 100, 90; ...
                 95, 82, 97;...
                 100, 85, 100];
>> student

8.练习:找到Ann Lane的第三个成绩90.显然这个问题不难。

9.structure functions(结构体功能)

rmfield是删除结构体,fieldname抓取结构体属性名称,rmfield是删除结构体的某一属性并生成为另一个结构体。

 

 10.nesting structure(嵌套结构)

结构体的属性值可以是结构体。

 其中A结构体有两个属性,分别是data和nest,并且nest是另一个结构体,包含属性testnum、xdata、ydata。

>> A = struct('data',[3 4 7; 8 0 1], 'nest',...
      struct('testnum', 'Test 1',...
      'xdata', [4 2 8],'ydata', [7 1 6]));
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
A.nest

 11.cell array(元组)使用大括号,有两种方式:

>> A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i};
A(2,2)={-pi:pi:pi};
A

A =

  2×2 cell 数组

    {3×3 double        }    {'Anne Smith'      }
    {[3.0000 + 7.0000i]}    {[-3.1416 0 3.1416]}

>> 

12. 练习创建一个B元组

 这里第四部分是一个cell,所以应该嵌套一个大括号。

>> B(1,1)={['This is the first cell']};
B(1,2)={[5+j*6 4+j*5]};
B(2,1)={[1 2 3; 4 5 6; 7 8 9]};
B(2,2)={
   
   {'Tim', 'Chris'}};
B

 13. accessing cell array(获取元组)

 如果看cell array的内容用大括号

如果想提取矩阵中的值就用()

 

 14.cell array functions(元组函数)

cell2struct和cell转换cell2struct

 

 magic魔方矩阵,每行每列每个对角线之和相等。mat2cell是分成三行,列不变。

 15.multidimensional array

行,列,层。

 把A和B接起来用cat()

 

 16.reshape

>> A = {'James Bond', [1 2; 3 4; 5 6];pi, magic(5)}

A =

  2×2 cell 数组

    {'James Bond'}    {3×2 double}
    {[    3.1416]}    {5×5 double}

>> c = reshape(A,1,4)

c =

  1×4 cell 数组

    {'James Bond'}    {[3.1416]}    {3×2 double}    {5×5 double}

>> 

 17.练习reshape

>> A = [1:3; 4:6]

A =

     1     2     3
     4     5     6

>> C = reshape(A,3,2)

C =

     1     5
     4     3
     2     6

>> 

 18.检查状态

 19. file Access

 20.save() and load()

save是存储,load则是取数据。加-ascii后的文件用note打开可以看见数值

 把两个文件存储在红色路径下。

 乱码

可以看到

 

清除之后读取文件,可以看到工作区的a

 ascii获取data需要加-ascii

>> load('mydata2.mat','-ascii')

21.只存储某个特定变量

找了一圈发现没有什么特别好的办法,就采用了憨憨办法,先把要保存的值设一下,然后直接存储。mydata2的第一个值是16,就把它存起来啦。

 22.excel file reading

 创建excel在指定目录下

两种方法读取的一样,第一种自动省略非数字部分。

 

 23. excel file writing

 计算平均数

其中‘是进行转置,因为matlab是以列向量计算,而我们要求每个人的平均值就需要转置,这时候的平均值其实是个列向量,所以计算完成之后还要进行一次转置。

把平均值M写到对应位置。


>> M = mean(Score')';
xlswrite('04Score.xlsx', M, 1,'E2:E4');
xlswrite('04Score.xlsx', {'Mean'}, 1, 'E1');

自动写入平均值

计算标准差

 SD=std(Score,0,2);
xlswrite('04score.xlsx',SD,1,'F2:F4');
xlswrite('04score.xlsx',{'标准差'},1,'F1');

 24. Getting text in excel spreadsheet

可以返回数字和题头。

 

Header是cell

 25.练习把score存到header中

 26.低阶文件输入/输出

文件要有fid,matlab才能处理。还有一个pointer是处理file的哪个部分

打开档案的同时还需要赋予权限。

 27.写sin数值

 

 %5.3f总共数值是5个,3个是小数点

 
>> x = 0:pi/10:pi; y = sin(x); fid = fopen('sinx.txt', 'w');
for i = 1:11
    fprintf(fid,'%5.3f %8.4f\n', x(i), y(i));
end
fclose(fid); type sinx.txt

 28.读取文件

因为名字是字符型,所以读5个字符一直到结束,第一个字符是J第二个是o以此类推。

执行第一次是第一行,执行第二次是第二行。

>> fid = fopen('04asciiData.txt','r');i=1;
while ~feof(fid)
   name(i,:) = fscanf(fid, '%5c', 1);
   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);

 可以看到工作区多了很多变量。

 

 以上就是台大郭彦甫MATLAB教程的第一部分笔记~

所有老师编写的代码与练习都在这里啦~接下来会更新后续课程。

猜你喜欢

转载自blog.csdn.net/qq_43604183/article/details/131492253