您的位置:首页 > 编程语言 > MATLAB

Matlab入门

2016-12-09 17:02 351 查看

1. 基础知识

1.1) 一些常用命令

who
: 显示在命令窗口中已经定义的命令(仅显示变量的名称)

whos
: 显示在命令窗口中已经定义的命令(显示变量的更多信息)

clear
: 清除所有变量,这些变量将不再存在

clear 变量名
: 清除指定的变量

format
: 在Matlab中,default表示
数字小数部分
占4位, format short 占4位,format long 占15位

...
: 表示连续运算符,连接下一行表达式

运算符
: + - * / \ ^, 运算符的优先级从高到低的顺序为:
()
->
^
->
-
->
* / \
->
+ -


help
: help sin可以查阅sin命令的文档和使用说明

数据类型
: 在Matlab中,数字在默认的状态下以double类型存储, 常用的数据类型有整型(int8, int16, int32), 浮点数(float, double), 字符(char), 逻辑(logical)

1.2) 向量和矩阵

1.2.1)创建向量

v = [1 2 3 4 5] 或者 v = [1, 2, 3, 4, ] % 行向量
v = [1; 2; 3; 4;] % 列向量
r = 1 : 3;
c = r';  % 通过转置来创建列向量

冒号操作符  :
v = 1 : 5   % 1 2 3 4 5
v = 1 : 2 : 5 % start : inc : end  1 3 5

linspace函数创建一个线性间隔的向量
linspace(x, y, n)创建范围从x到y, 包括n个值的向量
ls = linspace(3, 15, 5) % 3 6 9 12 15

向量的连接
newVec = [vec1 vec2] % vec1, vec2都是一维向量


1.2.2)向量元素的修改和访问

x = 2 : 5
x(1) %访问第一个元素 2
x(1) = 9  % 修改向量中的元素
x(6) % 向量的扩充 之间的空隙用0填充


1.2.3)创建矩阵

mat = [4 3 1; 2 5 6]
mat = [2 : 5; 5 : 8]

rand和randi函数来创建随机数矩阵
randi(2, 4) % 创建2 x 4 的随机数矩阵
randi(2) % 创建2 x 2 的随机数矩阵

zeros创建全为0的矩阵
zeros(3) % 创建3 x 3的全零矩阵
zeros(2, 4) % 创建2 x 4的全零矩阵


1.2.4)矩阵的访问和修改

mat = [2 : 4; 3 : 5]
mat(2, 3) %访问第二行,第三列的元素
mat(1:2, 2:3) %访问矩阵的一、二行,二、三列的元素

矩阵的单个索引参数,因为在Matlab中,矩阵中的元素是按照列进行存储的
intMat = randi(2, 2, [0 100]) % 2x2的矩阵,元素的范围0-100
intMat(1) % 按照列开始访问
intMat(2)

矩阵的扩容
mat = [2 : 4; 3 : 5]
mat(:, 4) = [9 2]'
mat(4, :) = 2 : 2 : 8


1.2.5) 维度

length
: 返回向量的元素个数

size
: 返回矩阵的行数和列数, 对于矩阵,length返回行数或者列数的最大值

numel
: 返回数组(向量或者矩阵)所有元素的个数

end
: 表示向量中的最后一个元素的索引,对于矩阵,它用来表示最后一行或者最后一列

改变维数
mat = randi(3, 4, [1 100])
reshape(mat, 2, 6) % 按照列开始
fliplr(mat) % 左右对称翻转
flipud(mat) % 上下对称翻转
rot90(mat) % 将矩阵逆时针旋转90度
repmat(mat, 3, 2) % 复制创建一个更大的矩阵,即形成3x2倍mat的矩阵


1.2.6)三维矩阵

对于一个三维矩阵来说,假想有一个二维矩阵平铺在平面上,第三维就是包含了更多的页面叠放在该页面上

mat = reshape(1 : 15, 3, 5)
newM = fliplr(flipud(mat))
mat(:, :, 2) = newM


2. Matlab程序设计

2.1) 输入和输出

输入数字
num = input('Enter the radius: ')

输入字符或者字符串
str = input('Eneter a string: ', 's')
或者
str = input('Enter a string: ') 输入的时候'hello' 要加上引号

disp: 用来显示表达式的结果, 但是disp不支持格式化显示
disp('hello') disp(29)

fprintf: 可以格式化的输出显示
fprint('The value is %d, for sure!\n', 29)


2.2) 图形绘画

clf
: 通过移除图像窗口中的所有内容来清除图像窗口

figure
: 在不需要任何参数的情况下创建一个新的空图形窗口,figure(n),表示创建和维持的多重独立的图像窗口

hold
: 是一种切换,它冻结图像窗口中的当前图,将新的图形覆盖在当前窗口中

legend
: 在图形窗口中显示说明框

clf
x = 0 : 2*pi/40 : 2*pi;
y = sin(x);
plot(x, y, 'ro')
hold on
y = cos(x);
plot(x, y, 'b+')
legend('sin', 'cos')
title('sin and cos on one graph')


2.3) 文件的输入/输出

关于文件,基本上有三种不同的操作方法或模式,即:

Read from (从文件读)

Written to (写入文件)

Append to (追加到文件)

save函数用来将矩阵中的数据写到一个数据文件中,或者追加到文件中
格式: save filename matrixVariableName -ascii
save filename matrixVariableName -ascii -append % 追加数据

load函数从文件中读出数据
load testfile.mat


2.3.1) 打开和关闭文件

使用fopen函数打开文件,如果打开文件失败,fopen返回-1,如果文件打开成功,则返回一个整型值作为文件标识符,当调用其他的文件IO函数时,使用这个文件标识符来指向该文件。

fid = fopen('filename', 'permission string');
...
fclost(fid);

读取文件
fscanf函数读取格式化数据到一个矩阵,转换格式符有:%d %s %f

textscan函数从一个文件中读取文本数据并且存储在元胞数组中

fgetl和fgets函数每次从一个文件中读取一行字符串,不同点是,如果行末有换行字符,fgets函数会保留,fgetl函数不会保留

mat = fscanf(fid, 'format', [dimensions]);
按照列方式读取数据到矩阵变量中
mat = fscanf(fid, '%f %c', [2 inf]); % 如果不知道文件中值的个数,inf

cellArray = textscan(fid, 'format'); % 返回的是一个元胞数组

fid = fopen('data.mat');
dataCell = textscan(fid, '%f %c');
fclose(fid);

写入文件
如果向文件中一次写入一行,可以用fprintf函数
fprintf(fid, 'format', variables);

读写excel文件
xlswrite和xlsread可以写入和读取扩展名为.xls的电子表格类文件
xlsread函数总是先返回数值然后返回文本, 返回值的类型是元胞


2.4) 函数的定义和使用

函数的种类:

计算并返回单值的函数

计算并返回多值的函数

函数值完成一个任务,如打印等,无任何返回值

functionName.m文件中的函数
单返回值
function outputArgument = functionName(input arguments)
% Comment describing the function
Statements here;
there must include assigning a value to the output argument

多返回值
function [output arguments] = functionName(input arguments)
%一定要给返回的值赋值
...
end

无任何返回值的函数
function functionName(input arguments)
...
end


多个函数放在一个M文件中,M文件的名字和主函数的名字相同

其他函数

1. 匿名函数
fnhandle = @(arguments) functionbody

cirArea = @(radius) pi*radius.^2;

pttran = @() fprintf('%.f\n', rand);

函数的句柄
facth = @factorial; % 将函数的句柄保存到facth变量中
facth(5);

str2func函数可以将字符串转换为句柄函数

输入参数数目可变
内建的varargin作为元胞数组存储输入参数的数目, nargin返回传递给函数的输入参数的数目

输出的参数数目可变
varargout
nargout 输出参数的个数


嵌套函数

嵌套函数是指一个外部函数可以包含内部函数,内部函数可以访问外部函数中定义的变量,外部函数不能访问内部函数定义的变量

递归函数

function fcan = fact(n)
if n == 1
facn = 1;
else
facn = n * fact(n-1);
end
end


3. 选择语句

Matlab中的关系运算符有:
> < >= <= == ~=
, Matlab中,逻辑真用整数1表示,逻辑假用整数0表示

逻辑运算符:
|| && ~ xor


3.1) for循环

for x = array  % x为循环变量, array是条件数组
commands  % 循环执行的代码
end

% example
for i = 1 : 10
a(i) = sin(i * pi /5)
end


3.2) while循环

while expression
commands
end

% example
num = 10;
while num >1
num = num / 2
end


3.3) if语句

if expression1
commands
elseif expression2
commands
else
commands
end


3.4) switch分支结构

switch expression0
case test_expression1
commands1
case test_expression2
commands2
otherwise
commands3
end

% example
x = input('输入需要换算的长度数值cm:');
unit = input('选择转换单位 (1 in, 2 ft, 3 m, 4 mm, 5 cm):');
switch unit
case {'inch', 'in', 1}
y = x * 2.54;
case {'feel', 'ft', 2}
y = x * 2.54 / 12;
case {'meter', 'm', 3}
y = x / 100;
case {'centermeter', 'cm', 4}
y = x;
case {'milimeter', 'mm', 5}
y = x * 10;
otherwise
disp('Unkonwn Units');
y = NaN;
end
disp(y)


3.5) try catch结构

try
commands
catch
commands
end

% example
x = rand(4 ,2)
y = magic(3)
try
z = x * y  %抛出维数不一致异常
catch
z = NaN
disp('两矩阵维数不同, 计算错误!')
end
disp(lasterr)
disp(lasterror)


3.6) 变量的作用域

任何变量的作用域就是这个变量起作用的工作区,脚本和命令窗口中创建的变量都使用基本工作空间。

3.7)字符串的操作

字符串由任意的字符构成(字符个数可能为0),下面是字符串的例子:

'' 'x' 'cat' 'hello world' '123'

worldMat = ['hello'; 'yuanda'] % 字符串组成的矩阵 2x5的字符矩阵
first = 'bird';
last = 'house';
result = [first last] % 字符的连接
或者用
strcat(first, last);

strvcat(first, last); % 垂直连接两个字符串 会自动填充空格

char函数创建一个字符矩阵
greetMat = char('hello', 'goodbye');

产生空格
blanks可以创建一个包含n个空格字符的字符串

sprintf函数可以用来创建一个字符串
sent1 = sprintf('the value is pi is %.2f', pi);

删除空格
deblank函数只能删除字符串的后置空格,而不能删除前置空格
strtrim函数能删除后置和前置空格,但不能删除字符串中间的空格

upper把字符串转换成全大写字母
lower把字符串转换成全小写字母

字符串的比较
strcmp函数逐个字符的比较字符串,如果两个字符串完全相同,则返回1,相反,如果字符串的长度不同或者由任意一个对应的字符不同,则返回逻辑假

word1 = 'cat';
word2 = 'car';
word3 = 'CAR';
strcmp(word1, word1); % 1
strcmp(word1, word2); % 0
strcmpi(word2, word3); % 忽略大小写

查找,替换和分割字符串
findstr函数接收两个字符串作为输入参数,它能找出长串中所有短串的匹配,并返回匹配的第一个字符的下标,如果有个,就返回下标向量
findstr('abcde', 'd') % 4
findstr('d', 'abcde') % 4
findstr('abcdeabdcedd', 'd') % 4 9 11 12

strfind 参数的顺序不一样 (字符串, 子串)
strfind('abcdeabcde', 'e'); % 5 10

strrep函数能够找到字符串中所有子串的匹配,然后用新的字符串取代
strrep(string, oldsubstring, newsubstring)
strrep('abcedabcde', 'e', 'x')

strtok函数能够把字符串分成几部分,默认的分割符是任意空格字符
PS: 字符串的剩余部分包括空格分割符, 无论是默认空白字符还是指定的分割符,前置分割符都会被忽略的。
[word rest] = strtok('Hello there');


4. 向量化代码

4.1) 向量和矩阵的运算

v = 1 : 4;
v = v * 3
v1 + v2 % 逐个元素进行的运算
v1 .^ v2 % 逐个元素
v1 .* v2 % 逐个元素
可以通过逻辑向量来访问向量中的元素

mat = [4 : 6; -1 : 1]
mat * 2 % 逐个元素的运算
matA ./ matB


tic toc
: 确定代码的执行时间的长度

5. 元胞和结构体

元胞数组是一种能够存储不同类型数值的数据结构,可以是向量或矩阵,普遍的应用场景是存储不同长度的字符串

结构体是一种可以把一定逻辑关系的值组合在一起的数据结构,这些值可以是不同的类型

主要区别:元胞数组是可
索引
的,所以可用于循环或向量化代码中,结构体不能被索引,这些值用
域名
来引用,将比索引更易记忆

5.1)元胞数组

在元胞数组中,使用的是
大括号
而不是方括号

cellRowVec = {23 'a' 1:2:9 'hello'};
cellColVec = {23; 'a'; 1:2:9; 'hello'};
cellMat = {23 'a'; 1:2:9 'hello'};
myCellMat = cell(2, 2); % 每个元素都是空向量的矩阵

使用##大括号##引用元胞的内容   内容索引
cellRowVec{2} % a
cellMat{1, 1} % 23
myCellMat{1, 1} = 23 % 赋值

使用##圆括号##引用元胞(元胞索引), 该结果值还是元胞

删除一个向量元胞数组中的元素
cellRowVec(2) = {}  % 圆括号

对于矩阵
myCellMat(1, :) = [] % 圆括号

names = {'Sue', 'Cathy', 'Xavier'};

cellstr函数可以把填充了空格的字符数组转换为删除了后置空格的元胞数组
greetMat = char('hello', 'goodbye'); % 字符数组 size 2x6
cellgreets = cellstr(greetMat);

char函数把元胞数组转化为字符矩阵
names = {'Sue', 'Cathy', 'Xavier'};
cNames = char(names);


5.2) 结构体

结构体是一种可以把有一定逻辑关系的值组合在一起的数据结构

package = struct('item_no', 123, 'cost', 19.99, 'price', 39.95, 'code', 'g');
另一种创建结构体的方法
package.item_no = 123;
package.cost = 19.99;
package.price = 39.93;
package.code = 'g';

newPack = package; % 新的结构体改变不会影响到原结构体

rmfield函数可以删除结构体中的一个域,它返回一个删除过域的新结构体
newPack = rmfield(newPack, 'code'); % 必须重新赋值

packFields = fieldnames(package); % 列出所有的域名
fieldnames函数返回的是一个域名的元胞数组


结构体向量, 相当与一条条记录

packages = struct('item_no', 123, 'cost', 19.99, 'price', 39.95);

packages(2) = struct('item_no', 456, 'cost', 5.99, 'price', 49.99);

packages(3) = struct('item_no', 587, 'cost', 11.11, 'price', 33.33);

costs = [packages.cost] % 列出所有的cost
a = 1:5;
b = [a] % a 和 b 是一样的


嵌套结构体

lineSeg = struct('endpoint1', struct('x', 2, 'y', 4'), ...
'endpoint2', struct('x', 1, 'y', 6));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab