Apr 22, 2009

Matlab 技巧,包含 plot, 图像显示

  1. 基本操作
  2. 图形
  3. 随机数
基本操作

$matlab -nodesktop 可以进入 text mode

在默认路径下创建
kv_init.m  可以省去添加路径的麻烦,选择要添加的路径,或所有路径

显示: disp('string')
判断字符串相等 strcmp(a,b)
判断变量/函数/类/文件/目录 是否定义 exist('name',var)

Toolbox:
lightspeed: 提高Matlab速度,如果不想用,把它的路径从 matlab 路径中删除

函数定义时,输入和输出的优先级都是从左往右
[y1 y2]=f(x1, x2)
如果调用时 y=f(x1)
则 y 为 y1

函数可以有可变个变量,即传递给它的变量少于定义的参数个数
这时可以通过如下方法判断
nargin
    nargout
    exist('A','var') checks only for variables.
    exist('A','builtin') checks only for built-in functions.
    exist('A','file') checks for files or directories.
    exist('A','dir') checks only for directories.
    exist('A','class') checks only for Java classes.
使用 struct 可以灵活的传递函数参数和输出,可以用 isstruct 结合 isfield 来判断 field 是否定义了。
if isstruct(para)
    if isfield(para,'numLevels')
        numLevels = para.numLevels;
    end
end

函数头注释必须每一行都有 %,不能断

比较浮点数相等
0.1==0.3/3 这是错误的。
要使用 abs(a-b) < eps


比较两个 array 是否相等 isequal

判断是否为NAN, INF
isnan()
isinf()

reshape 可以把多维矩阵 reshape  成其他维数,把矩阵根据维数从大到小向量化,再进行填充
A = reshape(B, 3,3,5) % 3x3x5

randperm(n) 生成 1:n 的permutation,用于随即排列

' 共轭转置
.'  非共轭转置

复数
abs 模
angle
real
imag 虚部

matlab 的 global variable

需要使用的地方都需要声明
% top.m 
global x;
x = [];

% subprogram.m
global x;
x = [x sin(r)];

图形

plot 参数,其他画图函数不一定有这些参数


semilogy: y 坐标为log
图像坐标,j 轴向下;axis ij 切换至该模式
普通坐标,y 轴向上;axis xy 切换至该模式
two axis modes




line 可以画线,circle 画圆,x 都指横轴。


比如有多种算法,最后需要将结果画在一张图中,由于 legend 是一次性指令,所以可以定义 cell 变量
更新如下
legendstr = {legendstr{:} new_str}


图形控制
figure
xlim
ylim
xlabel
ylabel
title
legend(str1, str2, str3,...) 说明图中每条曲线,参数中字符串的顺序即曲线的顺序
axis auto    Return to default axis limits 
axis equal   Equalize data units on x-, y-, and z-axes 
axis off     Remove axes                               
axis square  Make axis box square (cubic)              
axis tight   Set axis limits to range of data      
grid on/off
hold on/off  

figure(n) 带有 handler,这个 handler 是一个数字,对应 Figure n 的数字 n。这样在有多个图的情况下,可以很快的找到第 n 个 

保存 figure 图像,注意这里说的不是把矩阵保存成图像
handler = figure(num);
print(handler, 'driver', 'name')
比如
print(1,'-djpeg','foo')
将 figure 1 保存为 foo.jpg
缺省 handler 则保存 current figure

在显示图像时,如何按图像大小显示,禁止缩放(Matlab figure 缩放为简单缩放,会产生问题)?
参见这儿
重要的两条命令

I = imread('peppers.png');      %# Load a sample image
imshow(I);                      %# Display it
[r,c,d] = size(I);              %# Get the image size
set(gca,'Units','normalized','Position',[0 0 1 1]);  %# Modify axes size
set(gcf,'Units','pixels','Position',[200 200 c r]);  %# Modify figure size
hold on;
plot(100,100,'r*');             %# Plot something over the image
f = getframe(gcf);              %# Capture the current window
imwrite(f.cdata,'image2.jpg');  %# Save the frame data




将图像序列生成 avi
t = linspace(0,2.5*pi,40);
       fact = 10*sin(t);
       fig=figure;
       aviobj = avifile('example.avi')
       [x,y,z] = peaks;
       for k=1:length(fact)
           h = surf(x,y,fact(k)*z);
           axis([-3 3 -3 3 -80 80])
           axis off
           caxis([-90 90])
           F = getframe(fig);
           aviobj = addframe(aviobj,F);
       end
       close(fig)
       aviobj = close(aviobj);

如何在图形中加入公式,希腊字母等?
Matlab 的 Text 支持 Latex,简单的字符可以直接用,完整的支持必须加 Interpreter,latex 语句用 $$, 或 $$ $$ 包含(两者好像有区别?)
ylabel('\alpha');
options = {'Interpreter','latex'}; 
title('$$\int x^2 dx$$',options{:})

文件和文件夹操作
delete my_file.m
mkdir newdir

改名或者移动
movefile('myfile.m','projectresults.m')
rmdir('myfiles')
复制文件
copyfile

随机数:
基本随机数
rand
randi
randn
其他分布的随机数,请参见 help doc index: random number generators (RNGs)
多维数据只有 mvnrnd, mvtrnd

控制随机整数序列的 seed,新版的 Matlab 采用 RandStream 来生成随机整数,默认有一个 default 的 stream。可以将自己创建的 stram 设为 default,达到控制的目的。可以生成多个独立的 stream.

s=RandStream('mt19937ar');
reset(s,5)
rand(s)
rand(s)
reset(s,5)
rand(s)
rand(s)

mu = [1 -1]; Sigma = [.9 .4; .4 .3];
RandStream.setDefaultStream(s);
reset(s,5)
rand
rand
r = mvnrnd(mu, Sigma, 2)
reset(s,5)
rand
rand
r = mvnrnd(mu, Sigma, 2) 

0 comments: