常用的matlab函数命令
- 1 查看程序运行时间
- 2 查看字符串是否内容和长度是否一致,并返回逻辑值
- 3 把两种算法整合到一起
- 4 添加搜索路径
- 5 切换路径
- 6 三维矩阵的生成
- 7 三维矩阵的转换
- 8 只计算矩阵X'X的对角元
- 9 exist函数的使用
- 10 isfield函数的使用
- 11 fprintf函数的使用
- 12 非线性函数求根函数fzero
- 13 向量与矩阵的点乘
- 14 两个矩阵乘积的迹
- 15 对角矩阵乘以普通矩阵
- 16 matlab中实现打印矩阵
- 17 matlab中实现查看电脑的cpu核数
- 18 matlab 标注特殊点
- 18 两条线画在一个figure上
- 19 画水平线或者垂直线
- 20 因子旋转
- 21 matlab设置默认参数的方法
- 22 三维数组转化为cell格式
- 23 matlab生成的单张图片裁剪空白的方法
- 24 matlab生成的多张图片裁剪空白的方法
- 25 matlab打印向量
- 26 matlab在一个向量中删除其中一个子向量的两种方法:分别使用ismember和setdiff函数。
- 27 给定张量数据每个mode的最大因子数量,生成该mode的所有候选因子模型
- 28 给定张量数据每个mode的候选因子模型的集合,生成张量数据的所有候选模型
- 29 生成给定的多个向量的笛卡尔积
1 查看程序运行时间
% method 1
tic
toc
% method 2
profile on
profile viewer
% method 3
t1 = clock;
t2 = clock;
t = etime(t2,t1)
% method 4
t1 = cputime;
t = cputime - t1;
2 查看字符串是否内容和长度是否一致,并返回逻辑值
strcmp('AECM','AECM'); %返回逻辑值,0或者1
strcmpi(s1,s2); %此 MATLAB 函数 将比较 s1 和 s2,并忽略字母大小写差异。如果二者相同,函数将返回 1 (true),否则返回 0
(false)。如果文本的大小和内容相同,则它们将视为相等,不考虑大小写。返回结果 tf 的数据类型为 logical。
3 把两种算法整合到一起
switch alg % alg 代表算法的名字如CM,AECM
case 'CM' % 如果alg='CM',执行本段代码
case 'AECM' % 如果alg='AECM',执行本段代码
4 添加搜索路径
addpath
5 切换路径
cd('./temp') %切换到当前路径的temp文件夹
cd('../data') %切换到上一级目录的data文件夹
%% 一个点代表当前目录,两个点代表上一级目录
6 三维矩阵的生成
A = cat(3,magic(3),rand(3));
7 三维矩阵的转换
将三维矩阵 X X X形成二维矩阵并按照如下格式排列: X = ( X 1 X 2 , . . . , X n ) X = (X_1 X_2,...,X_n) X=(X1X2,...,Xn)
A(:,:)
三维矩阵的维度不变,第一维(行)和第二维(列)互换,第三维(页)不变;
B = permute(A,[2,1,3])
将三维矩阵 X X X形成二维矩阵并按照如下格式排列: X = ( X 1 ; X 2 ; . . . ; X n ) X = (X_1;X_2;...;X_n) X=(X1;X2;...;Xn)
C = permute(A,[1,3,2]);
D = reshape(C,[2*3,3]);
或者用另外一种思路:
B = permute(A,[2,1,3])
B(:,:)'
二维矩阵转化为三维矩阵:
tcell34 = permute(reshape(tcell34,[10,34,58]),[1,3,2]);
8 只计算矩阵X’X的对角元
当矩阵X的维度特别大时,有时我们只需要得到矩阵X’X的对角元素,而非矩阵X’X的全部元素,matlab如果直接用X’*X会很慢,在此利用点乘的想法实现快速计算:
矩阵X’X的对角元素为:
9 exist函数的使用
以数字形式返回 name 的类型。此列表描述与每个返回值关联的类型:
- 0 - name 不存在或因其他原因找不到。例如,如果 name存在于 MATLAB 不能访问的受限文件夹中,exist 将返回 0。
- 1 - name 是工作区中的变量。
- 2 - name 是扩展名为 .m、.mlx、 .mlapp 的文件,name 是具有未注册文件扩展名(.mat、.fig、.txt)的文件的名称。
- 3 - name 是 MATLAB 搜索路径上的 MEX文件。
- 4 - name 是已加载的 Simulink 模型或者位于 MATLAB 搜索路径上的 Simulink 模型或库文件。
- 5 - name 是内置 MATLAB 函数。这不包括类。
- 6 - name 是 MATLAB 搜索路径上的 P 代码文件。
- 7 - name 是文件夹。
- 8 - name是类。(如果使用 -nojvm 选项启动 MATLAB,则 exist 对 Java 类返回 0。)
MATLAB搜索从搜索路径的顶层开始并向下移动,直到找到结果或到达路径上的最后一个文件夹。如果一个文件夹中存在多个 name,根据函数优先顺序,MATLAB 将显示name 的第一个实例。文件夹是函数优先级规则的例外。除变量和内置函数外,它们的优先级高于所有类型。
此函数一般包含两个参数,第一个参数表示name,第二个参数表示搜索的内容的性质(是变量?还是文件?还是目录等?),第二个参数主要取以下值:第二个输入(可选)必须为 ‘var’、‘builtin’、‘class’、‘dir’ 或 ‘file’。
例:我要查看工作区的变量中是否具有s2这个变量:
exist('s2','var')
该函数通常和~符号连用
if(~exist('s2','var')) s2 = 1; end
解释:如果不存在s2这个变量,则定义变量s2 = 1。
10 isfield函数的使用
isfield函数:
isfield判定由这些字符串表示的域是否是结构体的域。返回值是个逻辑型数组。
student = struct('name', 'John', 'age', 20, 'score', 90);
x = {'name','salary'};
isfield(student,x);
返回的是逻辑值1或者0。
11 fprintf函数的使用
转载:http://blog.sina.com.cn/s/blog_6fb8aa0d01019icx.html
数据的格式化输出:fprintf(fid, format, variables)
fprintf('Is ''name'' a field of student structure? %d\n',isfield(student, 'name'));
解释代码:%d 代表输出整数,并用后面isfield(student, ‘name’)的返回值来替代;\n代表换行符。
12 非线性函数求根函数fzero
转载:https://www.cnblogs.com/mybany/p/8806231.html(如有侵权,请联系删除)
例1:
fun = @cos;
fzero(fun,[1 2])
在这里[1 2]代表的是在该区间内搜索零点,在此必须要保证函数在区间的两个端点是异号的,如cos1 = 0.5403,cos2 = -0.4161.因此此方法类似于使用的是二分法。
例2:
fzero(fun,3)
该式表示的是在3附近求零点。
13 向量与矩阵的点乘
A是
3
×
1
3 \times 1
3×1的列向量,B是
3
×
3
3 \times 3
3×3的方阵,则A与B的点乘就是A的每一个元素与B的每一行相乘。
代码如下:
A = [2 4 8]';
B = rand(3,3);
A.*B
例:
diag(A)*B的计算 等价于 A.*B
也就是说:
如果一个对角矩阵乘以一个矩阵时,可以用点乘的方式来计算,当维度较高时,速度较快。
同理,但如果B*diag(A)的计算等价于 B.*A’;
14 两个矩阵乘积的迹
A = rand(1000,1000);
B = rand(1000,1000);
tic
trace(A*B);
t1 = toc
tic
C = B';
sum(A(:).*C(:));
t2 = toc
求两个矩阵乘积的迹
15 对角矩阵乘以普通矩阵
A = diag([1 2 3 4]);
B = [1 2 3;
4 5 6;
7 8 9;
10 11 12];
A*B
等价于
diag(A).*B
因为diag(A)是一个列向量;
同理:
B = [1 2 3;
4 5 6;
7 8 9;
10 11 12];
C = diag([1 2 3]);
B*C
也可以使用点乘加速计算:
D =diag(C);
B.*D'
16 matlab中实现打印矩阵
fprintf([repmat('%d\t', 1, size(A, 2)) '\n'], A');
17 matlab中实现查看电脑的cpu核数
feature('numcores')
18 matlab 标注特殊点
plot(x,y,'ko','markerfacecolor','r','MarkerSize',5); %标注实心点
18 两条线画在一个figure上
plot(ind,D(:,1),'b-.',ind,D(:,2),'--',"LineWidth",1.5);
19 画水平线或者垂直线
line([5 5],[min(elvhbic) max(elvhbic)],'linestyle','--', 'Color','black');
20 因子旋转
[B,t] = rotatefactors(A,'method','varimax');
A是因子载荷矩阵,B是旋转后的因子载荷矩阵。
21 matlab设置默认参数的方法
使用可变输入参数varargin
if nargin > 1
[varargin{:}] = convertStringsToChars(varargin{:});
end
names = {'method' 'normalize' 'reltol' 'maxit'};
dflts = {'varimax' [] [] [] []};
[method,normalize,reltol,maxit] = internal.stats.parseArgs(names, dflts, varargin{:});
[d,m] = size(A);
methodNames = { 'varimax' 'promax'};
[method,~] = internal.stats.getParamVal(method,methodNames,'Method');
使用参数nargin
function [result]=some_fun(param1, param2)
if (nargin<3)
param3 = 'default_param3_value';
end
...
end
使用nargin和isempty命令
function [result]=some_fun(param1, param2,param3,param4)
#param1是必须输入参数,param2,param3,param4是可选参数
if nargin < 2|| isempty(param2), param2= 'on'; end
if nargin < 3 || isempty(param3), param3= sqrt(eps(class(A))); end
if nargin < 4 || isempty(param4), param4= 250; end
switch param2
case {'on',1}
h = sqrt(sum(A.^2, 2));
A = bsxfun(@rdivide, A, h);
case {'off',0}
% A = A;
otherwise
error(message('stats:rotatefactors:BadNormalize'));
end
end
22 三维数组转化为cell格式
a = rand(3,4,5);
c = mat2cell(a,3,4,ones(1,5));
23 matlab生成的单张图片裁剪空白的方法
set(gca,'looseInset',[0 0 0 0]);
24 matlab生成的多张图片裁剪空白的方法
tiledlayout(1,3,'TileSpacing','tight','Padding','none');
nexttile
xlabel(['资产质量因子V1',newline,'(a)']);
set(gca, 'LooseInset', [0,0,0,0]);
set(gcf,'Position',[0,0,1200,400]);
25 matlab打印向量
q_max = [1,2,0,3,0,4];
fprintf('\n---------> Maximum number of factors(q_max) for mode %s is(are) 0 ! \n',sprintf('%d ', find(~q_max)));
error('Maximum number of factors(q_max) for mode %s should be intergers and greater than 0!',sprintf('%d ', find(~q_max)));
26 matlab在一个向量中删除其中一个子向量的两种方法:分别使用ismember和setdiff函数。
teindex = 3:3:30; index = 1:30;
isindex = ismember(index, teindex);
trindex = index(~isindex);
除了用ismember函数外,还可以使用setdiff函数
[D, ia] = setdiff(index, teindex);
E = index(sort(ia));
setdiff得到的D是按照升序的顺序进行排列的,故需要重新排列。
27 给定张量数据每个mode的最大因子数量,生成该mode的所有候选因子模型
qmax = [6,6,6];
candq = cellfun(@(x) 1:x, num2cell(qmax), 'UniformOutput',false);
28 给定张量数据每个mode的候选因子模型的集合,生成张量数据的所有候选模型
qall = cartesianProduct(candq);
function cartProd = cartesianProduct(sets)
c = cell(1, numel(sets));
[c{:}] = ndgrid(sets{:});
result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
cartProd = sortrows(result, 1:numel(sets));
end
29 生成给定的多个向量的笛卡尔积
a = allcomb(1:6,2:5,1:8);
allcomb.m文件来自File Exchange. 或者使用28的cartesianProduct函数。