matlab 编程经验总结(论文算法仿真常用命令及技巧)
by mc
Matlab 编程
MATLAB 中改变默认工作路径(Current Folder)的方法
http://blog.csdn.net/u012210613/article/details/52346842
1. 用记事本或者 MATLAB 打开 C:\Program Files\MATLAB\R2012a\toolbox\local\matlabrc.m
文件。--即打开安装路径下的 matlabrc.m 文件(注:最开头的“X”你所安装的位置盘符)。
2. 在最后一行加入这条语句:
cd 'E:\MatlabFile'
恢复 m 文件关联
cwd=pwd;
cd([matlabroot '\toolbox\matlab\winfun\private']);
fileassoc('add',{'.m','.mat','.fig','.p','.mdl',['.' mexext]});
cd(cwd);
disp('Changed Windows file associations. FIG, M, MAT, MDL, MEX, and P files are now associated
with MATLAB.');
自动对齐
Ctrl +I
判断 cell 是否为空
cellfun(@isempty,assignment_list(i,1))
合并两个 cell
a=[a,b]
%注意 这里是方括号
转换 cell 为 double
cell2mat
输出文本
disp('CICS 所用时间:');
str = fprintf('%d/%d trail, %d/%d frame\n', nn, no_of_trials, k, Ns);
停止显示 warning
warning off
Warning: Variable 'a1' cannot be saved to a MAT-filewhose
version is older than 7.3.
To save this variable, use the -v7.3 switch.
Skipping...
解决办法:
打开 matlab,file/preferences,general 选项卡-MAT-Files,选择第一个。
内存不足:out of memory
Matlab 是如何存储矩阵的?
Matlab 中矩阵是以 Block,也就是块的形式存储的。当 Matlab 在为即将存储的矩阵划分块时,
如果没有相应大小的连续内存,即使实际内存没有被完全使用,它还是会报告“Out of
Memory”。
Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”
Out of Memory” 就会出现。在使用的过程中,由于存储单元的不断的被分配和清除,反复
分配和释放数组会使内存被分割成不连续的区域,可用的连续内存段减少,很容易造成“Out
of Memory”。因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,
这一点可以用命令 feature(’memstats’)(在 7.0 版本以上)看出。如果现实的最大连续
内存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以
考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这
些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不
必要的内存。
因此,治本的方法如下:
1. 在命令行输入 pack 整理内存空间
2. 尽量避免产生大的瞬时变量,把没必要的变量 clear 掉或当它们不用的时候应该及时 clear。
3. 减少变量,尽量的重复使用变量(跟不用的 clear 掉一个意思)。
4. 把有用的变量先 save,后 clear 掉,需要时再读出来。
保存变量至文件
save('all_path_25.mat','all_path_25');
跳出全部 for 循环
MATLAB 中只能一层层的跳出循环,使用 break,这和 C++等有所差别。你可以设置标志,满
足条件逐层 break。
取矩阵最大值及其坐标
% 修改自 lyqmath @ Matlab 中文论坛
clc; clear all; close all;
A = rand(5, 5, 5);
% 最大值统计
[Amax, indmax] = max(A(:))
% 最大值坐标
[i, j, w] = ind2sub(size(A), indmax)
% 验证
A(i, j, w)
判断文件是否存在
if ~exist('.\assignment_list\Nk1_Z_N2.mat','file')
save('.\assignment_list\Nk1_Z_N2.mat', 'assignment_list');
end
绘图
line_sty1= {'--ob','--sr','--^m','--+m','--g'};
只绘点不连线
plot( k_present(k_beg_idx:el), posn_k_present(2,k_beg_idx:el),line_sty1{i} );
% 设置线型及颜色,去除'--'表示
figure(3);subplot(2,1,1); xlabel('时间帧数'); ylabel('x/m');
set(gca, 'XLim',[1 K]);
% 设置坐标轴范围
% 设置 legend
h1_t= plot(k_birth(i):1:k_death(i),P(1,:),'-k');
final_fig_handle(1)= h1_t;
legend_title{1}= [ '真实 (',' 总共两个个目标)' ];
legend_title{i+2}= ['
标签= ',num2str(hat_total_track_list(i))];
figure(3);subplot(2,1,1); legend(final_fig_handle,legend_title,4);
颜色
r 红
m 紫红
g 绿
y 黄
b 蓝
k 黑
c 蓝绿
w 白
可以用 RGB 来指定任意颜色。你也可以改背景色再画白线。
plot(1:10,'Color',[0.4 0.5 0.6])
线型
'-' 实线 '--' 虚线
':' 点线 '-.' 点划线
各种标记点属性选项
+ 加号
o 空心圆
* 星号
.
实心圆
x 叉号符
s 正方形
d 菱形
^ 上三角形
v 下三角形
> 右三角形
< 左三角形
p 五角星
h 六边形
线条宽度
plot(x,y,'LineWidth',1.5)
设置坐标范围
axis([0 6 0 4]);
为 plot 点加标注
text(2.5,2.5,['(',num2str(2.5),',',num2str(2.5),')'],'color','r');
text(2.5,2.5, num2str(2.5),'color','r');
设置曲线不可见
if iBest==3 || iBest==4 || iBest==5 || iBest==7
line_sty1{iBest} = ':.w';
final_fig_handle(iBest) = plot(1:K, Pc_N, line_sty1{iBest}, 'Visible', 'off');
end
保存 plot 为图片
% 在句柄为 2 的图形窗口上画图。
%文件名为'D:\abc.jpeg'。
% 新建一个句柄为 2 的图形窗口。
>> figure(2)
>> plot(x,cos(x));
>> grid
str_png = sprintf('%dTrail',no_of_trials);
print(2,'-dpng',str_png); %将句柄为 2 的图形保存为 jpeg/jpg 格式的图片,
>>
用法:print(图形句柄,存储格式,文件名); <<回目录
图形句柄,如果图形窗口标题栏是“Figure 3”,则句柄就是 3.用 gcf 可以获取当前窗口句柄。
指定存储格式。常用的有:
png 格式:‚-dpng‘ (推荐这一种,与 bmp 格式一样清晰,文件也不大)
jpeg: ‚-djpeg‘(文件小,较清晰)
tiff: ‚-dtiff‘
bmp: ‚-dbitmap‘(清晰,文件极大)
gif: ‚-dgif‘(文件小但不清晰)
title 中带变量
title(sprintf('%d trail, %dBest', no_of_trials, bestCount));
消除向量中的重复元素
unique
比如说 A=[1,2,3,3,4],那么 unique(A)=[1,2,3,4];
find 函数
向量矩阵中查找某一元素的 index
1 >> X = [1 0 4 -3 0 0 0 8 6];
2 >> ind = find(X == 4)
matlab 的 find 函数出现 Empty matrix:0-by-1
读入一幅图像数据,想查找结果为 0.4 的值所在的位置,用
find(subimg==0.4)
结果返回 Empty matrix: 0-by-1!
明明数据中存在 0.4 啊,为何不显示?
原来,读入的数据计算机会用浮点数来表示,但是这个数值并不是精确等于 0.4,不信的话
可以将数组减去 0.4,可以发现所谓的等于 0.4 的位置相减以后并不为零,而是很小的一个
数值。
所以可以改为:
find(abs(subimg==0.4)<0.01)
这样就可以了。
这个问题很常见。对于由二进制码表示的浮点数,有一部分值是无法精确达到的。你可以输
入命令 vpa(d(71),20)
20 位,这时你就可以看到,这个值只是非常非常接近 1.7,但是不等于它。
ans =1.7000000000000001776。vpa 的意思是显示 d(71)到小数点后
元胞数组删除行
X(i,:) = [];
截断矩阵
assignment_list = assignment_list(1:cur,:);
选中一行代码运行
F9
显示当前时间
datestr(now)
调用其它程序
system('C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe')
发声
(1)
%鸟声
load chirp
sound(y,Fs)
%锣声
load gong
sound(y,Fs)
%哈里路亚
load handel
sound(y,Fs)
%笑声
load laughter
sound(y,Fs)
%啪哒声
load splat
sound(y,Fs)
%火车
load train
sound(y,Fs)
(2)
sound(sin(2*pi*25*(1:4000)/100));
pause(1);
sound(sin(2*pi*25*(1:4000)/100));
计时(小数点后保留 3 位)
方法 1:
tic
toc
方法 2:
t0=clock
程序段
t1 = etime(clock, t0)/60; %总耗时,单位:分钟
fprintf('总耗时:%.3f 分钟', t1);
%小数点后保留 3 位
取模运算
mod(x, y)
排列
prod(n:m)
%求排列数:m*(m-1)*(m-2)*…*(n+1)*n
排列数
combntns([1 2 3],2)
向量排序
[B index] = sort(A, 'descend');
根据某一列大小,对矩阵排序
1 >> a=[1,3,2;3,0,5;2,2,6];