业务优化求解需要,用到intlinprog函数,很久没用Matlab了,做下笔记以便随时查阅。
matlab中关于随机数的产生有3种库函数,下面我们来看看它们的形式:
1. rand()
它是生成0~1之间(开环,不包含0和1两个数)均匀分布的伪随机数。
函数格式如下:
R = rand(N) % 生成N×N的矩阵随机数,其中每个元素位于0~1之间
R = rand([M,N,P,...]) % 生成M×N×P×...的矩阵随机数
R = rand(M,N,P,...) % 同上,中括号不是必须
R = rand(..., CLASSNAME) % 生成CLASSNAME类型的随机数,如 'double' or 'single'
% 生成double类型的5×3均匀分布的0到1间随机数:
R = rand(5,3,'double');
% 生成100个位于[a,b]间的数据可表示为:
R = a + (b-a).*rand(100,1);
2. randi()
randi(N) 是生成(0,N]间均匀分布的伪随机数,并且数都是整数,所以每个数是位于1到N之间。它的表达形式有以下几种:
R = randi(iMax) % 生成1:iMax之间的均匀分布随机数
R = randi(iMax,m,n) % 生成m×n的1:iMax之间的均匀分布随机数
R = randi([iMin,iMax],m,n) % 生成m×n的iMin:iMax之间的均匀分布随机数
R1 = randi(10,5,1); % 生成5×1的1:10之间随机数
R2 = randi([10,20],2,3); % 生成2×3的10:20之间随机数
3. randn()
它生成的随机数整体概率为正态分布,均值为0,方差为1。也就是说生成的数中出现0的概率最大,而越往无穷或者负无穷概率越小,但是出现的随机数可能为所有实数,只不过出现的概率不同。它的格式如下:
R = randn(N) % 生成N×N个正态分布的随机数
R = randn(M,N) % 生成M×N个正态分布的随机数
R = randi(3); % 生成3×3的正态分布的随机数
4.稳定的重启分布rng
这里我们来看一下如何让每次程序运行生成的随机数都一样,主要借助的是rang函数,格式如下:
rng('default');
R = rand(1,5); % 每次程序运行生成恒定的1×5随机数
% 此外还有生成同样分布的表达方式:
s = rng;
R1 = rand(1,5);
rng(s);
R2 = rand(1,5); % R1和R2随机数一样
5. sort()
% 矩阵排序
B=sort(A) % 这样是默认 第一维(竖着)升序排列
B=sort(A,'descend') % 是竖排降序排列
B=sort(A,2,'descend') % 是横排降序排列
B=sort(A,'ascend') % 是竖排升序排列
6. sum()
sum(A) % 对A矩阵各列元素求和
sum(A,2) % 对A矩阵各行元素求和
sum(sum(A)) % 对A所有元素求和
7. sparse()
A = sparse( i,j,,s,m,n,nzmax )
主要意思:i, j, s都是向量,i,j分别为非零元素的行下标和列下标构成的列向量,i(k)和j(k)作为两个下标标记非零元素在矩阵中的位置,这个位置上的元素值为s(k).
i=[1 3 1 2 1 4];j=[1 1 2 2 3 4];s = [1 2 3 4 5 6];
sparse(i,j,s)
ans =
(1,1) 1
(3,1) 2
(1,2) 3
(2,2) 4
(1,3) 5
(4,4) 6
m,n表明A 是 m×n 阶矩阵(可省略);nzmax 用于指定A 中非零元素所用存储空间大小(可省略)。最简单的使用方式是只输入非零元的数据以及各非零元的行指标和列指标。
这是特殊的稀疏矩阵存储方式,它的特点是所占内存少,运算速度快。如果想得到矩阵的全元素存储方式,可用下面命令
B=full(A)
8. max和min
求矩阵A的最大值的函数有3种调用格式,分别是:
(1) max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。
(2) [Y,U]=max(A):返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号。
(3) max(A,[],dim):dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。
求最小值的函数是min,其用法和max完全相同。
数组最大值最小值直接可以用max和min;
9. 保存和导入工作区变量mat文件
save('aandc','A','C') % 将变量A,C保存到aandc.mat数据文件中
D=load('aandc','C') % 将数据文件aandc.mat中的变量C加载给D
注意:经过D=load('aandc','C'),即加载数据文件aandc.mat中变量C到变量D后,其实D是结构数组(struct),但D中包含的数据与C中的数据是一致的。
10. 字符串分割(split)
S = regexp(str, char, 'split')
以下面这样一串字符为例
Hello Nocturne Studio
str = deblank(str) % 首先去除首尾的多余空格
S = regexp(str, '\t', 'split')
S = regexp(str, '\s+', 'split') % 以一个或多个空格分隔
注意:上面得到的结果S是一个cell型变量,它的每个元素比如S(1)仍然是cell型的,只能用来display,不能直接用来进行字符串操作(比如获取其中的某个字符),所以我们在使用需要执行一次:
s1 = char(S(1))
这样的s1才是一个真正的字符串,可以进行后续的操作。
11. 括号用法的总结
- 对元胞使用(),返回的仍然是元胞
- 对元胞使用{},返回的则是元胞内的值
- []仅用于矩阵或者向量
12. str2num和strdouble区别
str2num和str2double具有相同点和不同点分别如下:
1. 当string为数值字符时:该情况下,两个函数是一样的。
str = '5';
a1 = str2num(str) % a1 = 5
a2 = str2double(str); % a2 = 5
2. 当string为非数字字符时:该情况下,两个函数是不一样的。
str = 'a';
a1 = str2num(str); % a1 = []
a2 = str2double(str); % a2 = NaN, 非数
13. 访问cell数组的数据
>> a={20,'matlab',ones(2,3)}
a =
[20] 'matlab' [2x3 double]
>> a(3) %查看cell数组a中的第三个cell
ans =
[2x3 double]
>> class(a(3)) %查看cell数组a中第三个cell的类型
ans =
cell
>> a{3} %查看cell数组a中第三个cell的内容
ans =
1 1 1
1 1 1
>> class(a{3}) %查看cell数组a中第三个cell的内容的类型
ans =
double
>> a(3)=[] %删除cell数组a中的第三个cell
a =
[20] 'matlab'
>> a{2}=[] %清空cell数组a中第二个cell的内容,并没有删除
a =
[20] []
14. 文本(.txt)处理
% 两列txt文件,32行
fileID1=fopen('pressure.txt');
A=textscan(fileID1,'%s %s');
fclose(fileID1);
T=A{1}
pres=A{2}
% 其中textscan(fileID1,'%s %s')中的'%s %s'表示按照字符型读取文本文件pressure.txt的两列数据。
T=str2double(T(2:32))
pres=str2double(pres(2:32))
% 绘图
plot(T,pres,'r-','LineWidth',5);hold on;
plot(T,pres,'LineStyle','none','Marker','o','MarkerFace','k','MarkerEdge','k')
set(gca,'FontSize',15,'TickDir','out','TickLength',[0.02,0.02])
xlabel('Temperature (K)'),ylabel('Pressure (Pa)')
15. 计算程序运行时间
在Matlab中,用tic 和 toc命令可以很轻松的实现。程序遇到tic时Matlab自动开始计时,运行到toc时自动计算此时与最近一次tic之间的时间。
16. 常用函数
- xlsread %读取excel表格
- sprintf()&disp(); %输出内容
- round();% 取整
- find();%查询
- length();%长度
- randperm();% 随机排列
- zeros();
- ones();
- class(A);
- whos;
- ['hello', blanks(3), 'world']或者strcat;%拼接字符串
- struct();