常用的matlab函数命令

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=(X1X2...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的对角元素为:
在这里插入图片描述
blog.csdnimg.cn/20201117235632303.png#pic_center)

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函数。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大浪淘沙_scc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值