LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

LOFTER-网易轻博

MATLAB

5476浏览    486参与
榜单数据更新于2020-02-19 23:35
沈雅

【matlab数字图像处理实验】图像基本操作

学习在 MATLAB 环境下对图像文件的基本操作,为读取各种格式的图像文件和后续进行的图像处理打下基础。


实验内容

  1. 1

    读出MATLAB 目录下图像文件并进行旋转、加亮、取反、多幅图片显示等操作。

  2. 2

    将MATLAB 目录下图像文件读出,显示它的图像及灰度直方图并进行直方图衡化。

    END

实验结果

  1. 1

    读取和显示
    I=imread('rice.tif');
    imshow(I);


  2. 2

    加亮
    I=imread('rice.tif');
    K=I+80;
    imshow(K);


  3. 3

    取反
    I=imread('rice.tif');
    J=imcomplement(I);
    imshow...

学习在 MATLAB 环境下对图像文件的基本操作,为读取各种格式的图像文件和后续进行的图像处理打下基础。


实验内容

  1. 1

    读出MATLAB 目录下图像文件并进行旋转、加亮、取反、多幅图片显示等操作。

  2. 2

    将MATLAB 目录下图像文件读出,显示它的图像及灰度直方图并进行直方图衡化。

    END

实验结果

  1. 1

    读取和显示
    I=imread('rice.tif');
    imshow(I);


  2. 2

    加亮
    I=imread('rice.tif');
    K=I+80;
    imshow(K);


  3. 3

    取反
    I=imread('rice.tif');
    J=imcomplement(I);
    imshow(J);


  4. 4

    翻转
    I=imread('rice.tif');
    K=imrotate(I,45);
    imshow(K

  5. 5

    图片信息
    whos I


  6. 6

    图片大小
    I=imread('rice.tif');
    size(I);
    [M,N] = size(I);


  7. 7

    彩色到黑白
    I=imread('lene.jpg');
    K=rgb2gray(I);
    subplot(1,2,1),imshow(I);
    title('原始图像')
    subplot(1,2,2),imshow(K);
    title('黑白图像')


  8. 8

    直方图均衡化
    I=imread('rice.tif');
    subplot(2,2,1),imshow(I)
    title('原始图像')
    subplot(2,2,3),imhist(I)
    title('原始图像直方图')
    a=histeq(I,256); %直方图均衡化,灰度级为256
    subplot(2,2,2),imshow(a) %输出均衡化后图像
    title('均衡化后图像')
    subplot(2,2,4),imhist(a)
    title('均衡化后图像直方图')


    END

小结

  1. 在后续的图像处理中,size()函数在图像点运算,比如域值化以及线性处理中有特别作
    用。subplot(,,),imshow()函数用于多幅图像的显示,而单独显示则使用figure,
    imshow()。

  2. 直方图是灰度级数的函数,反映了图像中具有该灰度级数的像素的个数。直方图均衡
    化就是把原图像的灰度直方图从比较集中的某个区间变成在全部灰度范围内的均匀分布。均
    衡化后图像的像素重新分配,使一定会度范围内的像素数量大致相同。图像的亮度变得更亮
    了,增强了图像的整体效果。

  3. 3

    均衡化后直方图趋于平坦化,灰度间隔(动态范围)拉大,对比度加强,图像清晰,便
    于读取、分析和处理。


heishuiguoweb

matlab:多对点间的距离

一、pdist

Pairwise distance between pairs of objects

Syntax

D = pdist(X)

D = pdist(X,distance)

Description

D = pdist(X)

计算 X 中各对行向量的相互距离(X是一个m-by-n的矩阵). 这里 D 要特别注意,D 是一个长为m(m–1)/2的行向量.可以这样理解 D 的生成:首先生成一个 X 的距离方阵,由于该方阵是对称的,且对角线上的元素为0,所以取此方阵的下三角元素,按照Matlab中矩阵的按列存储原则,此下三角各元素的索引排列即为(2,1),...

一、pdist

Pairwise distance between pairs of objects

Syntax

D = pdist(X)

D = pdist(X,distance)

Description

D = pdist(X)

计算 X 中各对行向量的相互距离(X是一个m-by-n的矩阵). 这里 D 要特别注意,D 是一个长为m(m–1)/2的行向量.可以这样理解 D 的生成:首先生成一个 X 的距离方阵,由于该方阵是对称的,且对角线上的元素为0,所以取此方阵的下三角元素,按照Matlab中矩阵的按列存储原则,此下三角各元素的索引排列即为(2,1), (3,1), ..., (m,1), (3,2), ..., (m,2), ..., (m,m–1).可以用命令 squareform(D) 将此行向量转换为原距离方阵.(squareform函数是专门干这事的,其逆变换是也是squareform。)

D = pdist(X,distance) 使用指定的距离.distance可以取下面圆括号中的值,用红色标出!

Metrics

Given an m-by-n data matrix X, which is treated as m (1-by-n) row vectors x1, x2, ..., xm, the various distances between the vector xs and xt are defined as follows:

欧几里德距离Euclidean distance('euclidean')

d 2 s,t =(x s x t )(x s x t ) ′  


Notice that the Euclidean distance is a special case of the Minkowski metric, where p = 2.

欧氏距离虽然很有用,但也有明显的缺点。

一:它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。

二:它没有考虑各变量的数量级(量纲),容易犯大数吃小数的毛病。所以,可以先对原始数据进行规范化处理再进行距离计算。


标准欧几里德距离Standardized Euclidean distance('seuclidean')

d 2 s,t =(x s x t )V 1 (x s x t ) ′  


where V is the n-by-n diagonal matrix whose jth diagonal element is S(j)2, where S is the vector of standard deviations.

相比单纯的欧氏距离,标准欧氏距离能够有效的解决上述缺点。注意,这里的V在许多Matlab函数中是可以自己设定的,不一定非得取标准差,可以依据各变量的重要程度设置不同的值,如knnsearch函数中的Scale属性。


马哈拉诺比斯距离Mahalanobis distance('mahalanobis')

d 2 s,t =(x s x t )C 1 (x s x t ) ′  


where C is the covariance matrix.

马氏距离是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧式距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。

如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧式距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离.

马氏优缺点:

  1)马氏距离的计算是建立在总体样本的基础上的,因为C是由总样本计算而来,所以马氏距离的计算是不稳定的;

  2)在计算马氏距离过程中,要求总体样本数大于样本的维数。

  3)协方差矩阵的逆矩阵可能不存在。 


曼哈顿距离(城市区块距离)City block metric('cityblock')

d s,t =∑ j=1 n ∣ ∣ x s j  x t j  ∣ ∣  


Notice that the city block distance is a special case of the Minkowski metric, where p=1.


闵可夫斯基距离Minkowski metric('minkowski')

d s,t =∑ j=1 n ∣ ∣ x s j  x t j  ∣ ∣  p    p  


Notice that for the special case of p = 1, the Minkowski metric gives the city block metric, for the special case of p = 2, the Minkowski metric gives the Euclidean distance, and for the special case of p = ∞, the Minkowski metric gives the Chebychev distance.

闵可夫斯基距离由于是欧氏距离的推广,所以其缺点与欧氏距离大致相同。


切比雪夫距离Chebychev distance('chebychev')

d s,t =max j ∣ ∣ x s j  x t j  ∣ ∣  


Notice that the Chebychev distance is a special case of the Minkowski metric, where p = ∞.


夹角余弦距离Cosine distance('cosine')

d s,t =1x s x t  ′  ∥x s ∥ 2 ∥x t ∥ 2    


与Jaccard距离相比,Cosine距离不仅忽略0-0匹配,而且能够处理非二元向量,即考虑到变量值的大小。


相关距离Correlation distance('correlation')

d s,t =1x s x t  ′  (x s x s  ˉ ˉ ˉ  )(x s x s  ˉ ˉ ˉ  ) ′   √ (x t x t  ˉ ˉ ˉ  )(x t x t  ˉ ˉ ˉ  ) ′   √    


Correlation距离主要用来度量两个向量的线性相关程度。

汉明距离Hamming distance('hamming')

d s,t =(#(x s j  ≠x t j  ) n  ) 


两个向量之间的汉明距离的定义为两个向量不同的变量个数所占变量总数的百分比。


杰卡德距离Jaccard distance('jaccard')

d s,t =#[(x s j  ≠x t j  )∩((x s j  ≠0)∪(x t j  ≠0))] #[(x s j  ≠0)∪(x t j  ≠0)]   


Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象。很显然,Jaccard距离不关心0-0匹配,而Hamming距离关心0-0匹配。


Spearman distance('spearman')

d s,t =1(r s r s  ˉ ˉ ˉ  )(r t r t  ˉ ˉ ˉ  ) ′  (r s r s  ˉ ˉ ˉ  )(r s r s  ˉ ˉ ˉ  ) ′   √ (r t r t  ˉ ˉ ˉ  )(r t r t  ˉ ˉ ˉ  ) ′   √    


where

rsj is the rank of xsj taken over x1j, x2j, ...xmj, as computed by tiedrank

rs and rt are the coordinate-wise rank vectors of xs and xt, i.e., rs = (rs1, rs2, ... rsn)

r s  ˉ ˉ ˉ  =1 n  ∑ j r s j  =n+1 2   

r t  ˉ ˉ ˉ  =1 n  ∑ j r t j  =n+1 2   

二、pdist2

Pairwise distance between two sets of observations

Syntax

D = pdist2(X,Y)

D = pdist2(X,Y,distance)

D = pdist2(X,Y,'minkowski',P)

D = pdist2(X,Y,'mahalanobis',C)

D = pdist2(X,Y,distance,'Smallest',K)

D = pdist2(X,Y,distance,'Largest',K)

[D,I] = pdist2(X,Y,distance,'Smallest',K)

[D,I] = pdist2(X,Y,distance,'Largest',K)

Description

这里 X 是 mx-by-n 维矩阵,Y 是 my-by-n 维矩阵,生成 mx-by-my 维距离矩阵 D。

[D,I] = pdist2(X,Y,distance,'Smallest',K)

生成 K-by-my 维矩阵 D 和同维矩阵 I,其中D的每列是原距离矩阵中最小的元素,按从小到大排列,I 中对应的列即为其索引号。注意,这里每列各自独立地取 K 个最小值。

例如,令原mx-by-my 维距离矩阵为A,则 K-by-my 维矩阵 D 满足 D(:,j)=A(I(:,j),j).


jying1102

matlab中disp函数的使用

原文地址:matlab中disp函数的使用作者:阿元

例子来源于网络:关键是看disp函数怎么把字符和数字在一起进行显示。

两点生成直线程序

%%以下是一个通过给定两点显示直线方程的程序,

%%该程序需要给出两个点的坐标,结果返回为y=kx+b的格式,且求得斜率

function [k,a1,b,type]=straight_line(A,B) % 输入,A,B两点坐标

V=B-A;

a=inf;

b=inf;

type='undefined';

if A==B

    'The two points are the same'...

原文地址:matlab中disp函数的使用作者:阿元

例子来源于网络:关键是看disp函数怎么把字符和数字在一起进行显示。

两点生成直线程序

%%以下是一个通过给定两点显示直线方程的程序,

%%该程序需要给出两个点的坐标,结果返回为y=kx+b的格式,且求得斜率

function [k,a1,b,type]=straight_line(A,B) % 输入,A,B两点坐标

V=B-A;

a=inf;

b=inf;

type='undefined';

if A==B

    'The two points are the same'

    return

end

if V(1)==0 && V(2)==0

    disp('Enter two distinct points next time')

    return

end

 

if V(1)==0

    type='vertical';

elseif V(2)==0

    type='horizontal';

else

    type='oblique';

    slope=atan2(V(2),V(1));

    s=inv([A(1) 1;B(1) 1])*[A(2) B(2)]';

    a=s(1);

    b=s(2);

end

 

switch type

    case 'vertical'

        disp('经过这两个点的直线方程为::');

        disp(['x = ',num2str(A(1))]);

    case 'horizontal'

        disp(' 经过这两个点的直线方程为:: ');

        disp(['y =',num2str(A(2))])  ;

    case 'oblique'

        disp(' 经过这两个点的直线方程为:') ;

        disp(['y = ',num2str(a) ,' *x +',num2str(b)]);

        disp('斜率为:')

        k=num2str(a);%将符号数值化

end

windskiss_me

将MATLAB中的矩阵写入TXT文件的方法

转载自http://blog.sina.com.cn/s/blog_4c9c4e2b0100d7pn.html

文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。
1、文件的打开与关闭
1)打开文件
在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:
fid=fopen(文件名,‘打开方式’)
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
 ‘r’:...

转载自http://blog.sina.com.cn/s/blog_4c9c4e2b0100d7pn.html

文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。
1、文件的打开与关闭
1)打开文件
在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:
fid=fopen(文件名,‘打开方式’)
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
 ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
 ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
 ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
 ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
 ‘a’:在打开的文件末端添加数据。文件不存在则创建。
 ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。
2)关闭文件
文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:
sta=fclose(fid)
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。
2、二进制文件的读写操作
1)写二进制文件
fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:
COUNT=fwrite(fid,A,precision)
说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。
例6.8 将一个二进制矩阵存入磁盘文件中。
>> a=[1 2 3 4 5 6 7 8 9];
>> fid=fopen('d:\test.bin','wb') %以二进制数据写入方式打开文件
fid =
3 %其值大于0,表示打开成功
>> fwrite(fid,a,'double')
ans =
9 %表示写入了9个数据
>> fclose(fid)
ans = 
0 %表示关闭成功
2)读二进制文件
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
[A,COUNT]=fread(fid,size,precision)
说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。precision用于控制所写数据的精度,其形式与fwrite函数相同。
3、文本文件的读写操作
1)读文本文件
fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:
[A,COUNT]=fscanf(fid,format,size)
说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
2)写文本文件
fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为:
fprintf(fid,format,A)
说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。
例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。
>> a='string';
>> fid=fopen('d:\char1.txt','w');
>> fprintf(fid,'%s',a);
>> fclose(fid);
>> fid1=fopen('d:\char1.txt','rt');
>> fid1=fopen('d:\char1.txt','rt');
>> b=fscanf(fid1,'%s')
b =
string

matlab读txt文件

fid=fopen('fx.txt','r'); %得到文件号
[f,count]=fscanf(fid,'%f %f',[12,90]);
%把文件号1的数据读到f中。其中f是[12 90]的矩阵
%这里'%f %f'表示读取数据的形势,他是按原始数据型读出
fclose(fid);
%关闭文件
另外有的txt文件还可以用load来打开
其语句为
f=load('fx.txt)

一个写入txt文件的小例子:

N=100;
R=rand(1,N);
fid = fopen('tt.txt','wt');
for k=1:N;
p=num2str(R(k));
fprintf(fid,'%c',p);
fprintf(fid,'%c\n',' ');
end
fclose(fid);

eyeandroid

Matlab 支持向量机(SVM)实现多分类

1、首先,你需要安装完成Matlab。 
2、将libsvm-3.17.zip和drtoolbox.tar文件解压到:libsvm-3.17文件夹和drtoolbox,并放到MATLAB的工具箱安装目录下, 
例如:C:\Program Files\MATLAB\R2014a\toolbox目录下。 
3、启动Matlab。 
4、单击File菜单下的Set Path...菜单项,打开Set Path对话框。 
5、单击Add with Subfolders...命令按钮,进入C:\Program Files\MATLAB\R2014a...
1、首先,你需要安装完成Matlab。 
2、将libsvm-3.17.zip和drtoolbox.tar文件解压到:libsvm-3.17文件夹和drtoolbox,并放到MATLAB的工具箱安装目录下, 
例如:C:\Program Files\MATLAB\R2014a\toolbox目录下。 
3、启动Matlab。 
4、单击File菜单下的Set Path...菜单项,打开Set Path对话框。 
5、单击Add with Subfolders...命令按钮,进入C:\Program Files\MATLAB\R2014a\toolbox\drtoolbox文件夹,单击确定按钮,此时Set Path对话框右边的MATLAB search path列表框中会增加3个搜索路径。 
6、重复上述操作,进入C:\Program Files\MATLAB\R2014a\toolbox\libsvm-3.17文件夹,添加libsvm的11个搜索路径。 
7、单击Save按钮,然后单击Close按钮。 
8、运行:C:\Program Files\MATLAB\R2014a\toolbox\libsvm-3.17下的make.m文件。然后查看\libsvm-3.17\matlab目录下是否生成了libsvmread.mexw32,libsvmwrite.mexw32,svmtrain.mexw32,svmpredict.mexw32这4个文件。如果是,说明libsvm的matlab已经编译成功了。 
ok.setup success! 

libsvm-3.17.zip和drtoolbox.tar文件下载地址:http://download.csdn.net/detail/bingecuilab/8633397资源分1。评论资源后返还积分、 

SVM实现分类的Matlab源码: http://www.eyesourcecode.com/thread-46124-1-1.html
微亮的烛光

粒子群优化算法(PSO)MATLAB源程序

作者:Aaron    博客:微亮的烛光

题记:由于最近有网友根据我之前编写的粒子群算法向我提问,就重新看了一下自己之前的MATLAB程序,发现自己当时编写的程序从易读性和简洁性上都惨不忍睹,遂依据自己对MATLAB编程最新的理解,以矩阵思想重新编写了PSO程序,极大的简化了程序。同时在征得网友同意后将一个算例分享出来,希望可以帮助更多的人。

说明:粒子群优化算法(Particle Swarm Optimization, PSO)是群智能优化算法之一,具有便于实现和收敛速度快等优点。本人在研究这个算法的时候,编写了...

粒子群优化算法(PSO)MATLAB源程序

作者:Aaron    博客:微亮的烛光

题记:由于最近有网友根据我之前编写的粒子群算法向我提问,就重新看了一下自己之前的MATLAB程序,发现自己当时编写的程序从易读性和简洁性上都惨不忍睹,遂依据自己对MATLAB编程最新的理解,以矩阵思想重新编写了PSO程序,极大的简化了程序。同时在征得网友同意后将一个算例分享出来,希望可以帮助更多的人。

说明:粒子群优化算法(Particle Swarm Optimization, PSO)是群智能优化算法之一,具有便于实现和收敛速度快等优点。本人在研究这个算法的时候,编写了一些测试的MATLAB源程序,在此分享,以供学习交流之用。这个是最基本的粒子群优化算法。

文件结构:

         主函数:pso.m

         适应度函数:fitness.m

源代码:

下载地址:pso.rar

---------------------------pso.m---------------------------

function [  ] = pso( )

%PSO Algorithm

%求解变量需要归一化在(0,1)范围

%求解目标函数为使适应度最小

clear all;

%设置数据格式

format short;

%设置粒子群算法参数

p_num=50;              %粒子数量(种群规模)

p_size=2;               %粒子维数(求解变量个数)

i_max=50;             %最大迭代次数

%%%%%%%%初始化迭代结果存储矩阵

gbest=zeros(p_size,i_max);              %全局最优粒子位置矩阵

gbestf=zeros(1,i_max);                  %全局最优粒子适应度矩阵

%%%%%%%%初始化粒子群

i=1;                                    %迭代次数,index ofiteration

particle=rand(p_size,p_num);            %粒子位置(0,1)

particle=(ones(p_size,1)*(sum(particle)<1)).*particle;%目标函数额外限制条件p1+p2<1,否则至0

pfitness=fitness(particle);             %粒子适应度

pbest=particle;                         %局部最优粒子

pbestf=pfitness;                        %局部最优粒子适应度

[gbestf(1,i),gIndex]=min(pbestf);       %全局最优粒子适应度及索引

gbest(:,i)=pbest(:,gIndex);             %全局最优粒子位置

velocity=-1+2.*rand(p_size,p_num);      %粒子速度(-1,1)

%%%%%%%%迭代计算

for i=2:i_max

    %粒子位置 - 位置更新公式&取值范围限制条件(0,1)

    p=particle+velocity;                 

   p=p.*(p>=0).*(p<=1)+(p<0).*(1e-4)+(p>1).*(9e-4);

   p=(ones(p_size,1)*(sum(p)<1)).*p+(ones(p_size,1)*(sum(p)>=1)).*particle;   %目标函数额外限制条件p1+p2<1

    %粒子适应度 - 目标函数

    pf=fitness(p);

    %局部最优粒子 - 取适应度小的粒子

   pbest=(ones(p_size,1)*(pf<=pfitness)).*p+(ones(p_size,1)*(pf>pfitness)).*particle;

    %局部最优粒子适应度

   pbestf=(pf<=pfitness).*pf+(pf>pfitness).*pfitness;

    %全局最优粒子适应度及索引 - 取适应度全局最小的粒子

    [gbestf(1,i),gIndex]=min(pbestf);

    %全局最优粒子位置

    gbest(:,i)=pbest(:,gIndex);

    %粒子速度 - 速度更新公式&取值范围限制条件(-1,1)

   v=velocity+1.3*rand*(pbest-p)+1.3*rand*(gbest(:,i)*ones(1,p_num)-p);

   v=v.*(v>=-1).*(v<=1)+(v<-1).*(-9e-4)+(v>1).*(9e-4);

    %更新粒子位置

    particle=pbest;

    %更新粒子速度

    velocity=v;

end

save('ResultGbest','gbest','gbestf','-ascii','-tabs','-append');

figure=plot(gbestf);

xlabel('迭代次数');

title('全局最优粒子适应度');

saveas(figure,'ResultGbest.fig');

saveas(figure,'ResultGbest.bmp');

end

--------------------------fitness.m--------------------------

function [ f ] =fitness( p )

%The TragetFunction for PSO to calculate the fitness

[p_size,p_num]=size(p);

f=100*(30*ones(1,p_num)-10*p(1,:)-24*p(2,:));

end

 

算例:

数学规划模型min(x)=10*x1+3*x2+15*x3,

约束条件是x1+x2+x3=200,x1,x2,x3都大于零

可以理解为要求得使min(x)最小的x1, x2, x3的取值

求解:

根据x1+x2+x3=200,可以将问题降维

取x3=200-x1-x2,且x3>0,

有min(x)=10*x1+3*x2+15*(200-x1-x2)=3000-5*x1-12*x2,

约束条件为200>x1>0,200>x2>0,x1+x2<200,

归一化使p1=x1/200, p2=x2/200, 有p1+p2<1,

min(p)=3000-1000*p1-2400*p2=100*(30-10*p1-24*p2),

即只要求得使min(p)最小的p1和p2即可

说明:

在原程序中的变量对应关系

i:迭代次数

particle(1,:):即求解问题中的p1

particle(2,:):即求解问题中的p2

fitness():即求解的目标函数min(p)

所求的结果存于gbest矩阵中,每迭代一次存储一次结果

程序的所有运行结果存于文件ResultGbest.mat

结果:

PSO的近似结果为:

min(p)=602

p1=0.999,p2=0.0001即x1=199.8, x2=0.02, x3=0.18

寻优结果:


本文是原创文章,转载请保留原作者和出处信息。

由于个人水平有限,不足之处还望多多包涵,欢迎批评指正。

                                                                                                       By  Aaron


baolong_zhu

MATLAB-s-function错误总结: 调用外部函数

正在创建库 C:\DOCUME~1\ZBL\LOCALS~1\TEMP\MEX_TO~1\templib.x 和对象 C:\DOCUME~1\ZBL\LOCALS~1\TEMP\MEX_TO~1\templib.exp 

two.obj : error LNK2019: 无法解析的外部符号 _detector_haar,该符号在函数 _mdlOutputs 中被引用 

two.mexw32 : fatal error LNK1120: 1 个无法解析的外部命令 


注意两点:

1.被调函数名为void xx_Outputs_wrapper(){xx,...

正在创建库 C:\DOCUME~1\ZBL\LOCALS~1\TEMP\MEX_TO~1\templib.x 和对象 C:\DOCUME~1\ZBL\LOCALS~1\TEMP\MEX_TO~1\templib.exp 

two.obj : error LNK2019: 无法解析的外部符号 _detector_haar,该符号在函数 _mdlOutputs 中被引用 

two.mexw32 : fatal error LNK1120: 1 个无法解析的外部命令 



注意两点:

1.被调函数名为void xx_Outputs_wrapper(){xx,xx,xx} ,文件名应为xx_wrapper.c  , s-function 中声明:extern void xx_Outputs_wrapper(){xx,xx,xx}

2. mex时 把所有文件都罗列上  mex   sfuntion.c     xx_wrapper.c

tang_blue

灰度图像的直方图

clear

close all

I=imread('f:/Program Files/images/matlab/lenna-hui.png');

imhist(I)

title(' 直方图');

clear

close all

I=imread('f:/Program Files/images/matlab/lenna-hui.png');

imhist(I)

title(' 直方图');

zsw-122

转:分享matlab程序之——滤波器篇(高通,低通)

原文地址:http://blog.sina.com.cn/s/blog_574d08530100qu18.html

快毕业了,把自己写的现成的matlab函数分享给有需要的人,由于个人水平有限,写的不好请见谅,愿意拍砖的尽管拍好了。目前还不考虑读博,所以写的程序仍了可惜,所以就拿出来分享。好了不废话了,开始正题。


以下两个滤波器都是切比雪夫I型数字滤波器,不是巴特沃尔滤波器,请使用者注意!

1.低通滤波器

使用说明:将下列代码幅值然后以m文件保存,文件名要与函数名相同,这里函数名:lowp。

function y=lowp(x,f1,f3,rp,rs,Fs)
%低通滤波...

原文地址:http://blog.sina.com.cn/s/blog_574d08530100qu18.html

快毕业了,把自己写的现成的matlab函数分享给有需要的人,由于个人水平有限,写的不好请见谅,愿意拍砖的尽管拍好了。目前还不考虑读博,所以写的程序仍了可惜,所以就拿出来分享。好了不废话了,开始正题。

 

以下两个滤波器都是切比雪夫I型数字滤波器,不是巴特沃尔滤波器,请使用者注意!

1.低通滤波器

使用说明:将下列代码幅值然后以m文件保存,文件名要与函数名相同,这里函数名:lowp。

function y=lowp(x,f1,f3,rp,rs,Fs)
%低通滤波
%使用注意事项:通带或阻带的截止频率的选取范围是不能超过采样率的一半
%即,f1,f3的值都要小于 Fs/2
%x:需要带通滤波的序列
% f 1:通带截止频率
% f 3:阻带截止频率
%rp:边带区衰减DB数设置
%rs:截止区衰减DB数设置
%FS:序列x的采样频率
% rp=0.1;rs=30;%通带边衰减DB值和阻带边衰减DB值
% Fs=2000;%采样率
%
wp=2*pi*f1/Fs;
ws=2*pi*f3/Fs;
% 设计切比雪夫滤波器;
[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);
[bz1,az1]=cheby1(n,rp,wp/pi);
%查看设计滤波器的曲线
[h,w]=freqz(bz1,az1,256,Fs);
h=20*log10(abs(h));
figure;plot(w,h);title('所设计滤波器的通带曲线');grid on;
%
y=filter(bz1,az1,x);%对序列x滤波后得到的序列y
end

--------------------------------------

低通滤波器使用例子的代码

fs=2000;
t=(1:fs)/fs;
ff1=100;
ff2=400;
x=sin(2*pi*ff1*t)+sin(2*pi*ff2*t);
figure;
subplot(211);plot(t,x);
subplot(212);hua_fft(x,fs,1);
%低通测试
% y=filter(bz1,az1,x);
y=lowp(x,300,350,0.1,20,fs);
figure;
subplot(211);plot(t,y);
subplot(212);hua_fft(y,fs,1);%hua_fft()函数是画频谱图的函数,代码在下面给出,要保存为m文件调用

%这段例子还调用了我自己写的专门画频谱图的函数,也给出,不然得不出我的结果

%画信号的幅频谱和功率谱
%频谱使用matlab例子表示
function hua_fft(y,fs,style,varargin)
%当style=1,画幅值谱;当style=2,画功率谱;当style=其他的,那么花幅值谱和功率谱
%当style=1时,还可以多输入2个可选参数
%可选输入参数是用来控制需要查看的频率段的
%第一个是需要查看的频率段起点
%第二个是需要查看的频率段的终点
%其他style不具备可选输入参数,如果输入发生位置错误
nfft= 2^nextpow2(length(y));%找出大于y的个数的最大的2的指数值(自动进算最佳FFT步长nfft)
%nfft=1024;%人为设置FFT的步长nfft
  y=y-mean(y);%去除直流分量
y_ft=fft(y,nfft);%对y信号进行DFT,得到频率的幅值分布
y_p=y_ft.*conj(y_ft)/nfft;%conj()函数是求y函数的共轭复数,实数的共轭复数是他本身。
y_f=fs*(0:nfft/2-1)/nfft;�T变换后对应的频率的序列
% y_p=y_ft.*conj(y_ft)/nfft;%conj()函数是求y函数的共轭复数,实数的共轭复数是他本身。
if style==1
    if nargin==3
        plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));%matlab的帮助里画FFT的方法
        %ylabel('幅值');xlabel('频率');title('信号幅值谱');
        %plot(y_f,abs(y_ft(1:nfft/2)));%论坛上画FFT的方法
    else
        f1=varargin{1};
        fn=varargin{2};
        ni=round(f1 * nfft/fs+1);
        na=round(fn * nfft/fs+1);
        plot(y_f(ni:na),abs(y_ft(ni:na)*2/nfft));
    end

elseif style==2
            plot(y_f,y_p(1:nfft/2));
            %ylabel('功率谱密度');xlabel('频率');title('信号功率谱');
    else
        subplot(211);plot(y_f,2*abs(y_ft(1:nfft/2))/length(y));
        ylabel('幅值');xlabel('频率');title('信号幅值谱');
        subplot(212);plot(y_f,y_p(1:nfft/2));
        ylabel('功率谱密度');xlabel('频率');title('信号功率谱');
end
end

下面三幅图分别是滤波前的时频图,滤波器的滤波特性曲线图和滤波后的时频图,通过图可以看出成功留下了100Hz的低频成分而把不要的高频成分去除了。

分享matlab程序之——滤波器篇(高通,低通)

分享matlab程序之——滤波器篇(高通,低通)

分享matlab程序之——滤波器篇(高通,低通)

2.高通滤波器

function y=highp(x,f1,f3,rp,rs,Fs)
%高通滤波
%使用注意事项:通带或阻带的截止频率的选取范围是不能超过采样率的一半
%即,f1,f3的值都要小于 Fs/2
%x:需要带通滤波的序列
% f 1:通带截止频率
% f 2:阻带截止频率
%rp:边带区衰减DB数设置
%rs:截止区衰减DB数设置
%FS:序列x的采样频率
% rp=0.1;rs=30;%通带边衰减DB值和阻带边衰减DB值
% Fs=2000;%采样率
%
wp=2*pi*f1/Fs;
ws=2*pi*f3/Fs;
% 设计切比雪夫滤波器;
[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);
[bz1,az1]=cheby1(n,rp,wp/pi,'high');

%查看设计滤波器的曲线
[h,w]=freqz(bz1,az1,256,Fs);
h=20*log10(abs(h));
figure;plot(w,h);title('所设计滤波器的通带曲线');grid on;
y=filter(bz1,az1,x);
end

下面是高通滤波器的例子

fs=2000;
t=(1:fs)/fs;
ff1=100;
ff2=400;
x=sin(2*pi*ff1*t)+sin(2*pi*ff2*t);
figure;
subplot(211);plot(t,x);
subplot(212);hua_fft(x,fs,1);

%------高通测试
z=highp(x,350,300,0.1,20,fs);
figure;
subplot(211);plot(t,z);
subplot(212);hua_fft(z,fs,1);

下面三幅图分别是滤波前的时频图,滤波器的滤波特性曲线图和滤波后的时频图,通过图可以看出成功留下了400Hz的高频成分而把不要的低频成分100Hz去除了。

分享matlab程序之——滤波器篇(高通,低通)

分享matlab程序之——滤波器篇(高通,低通) 



分享matlab程序之——滤波器篇(高通,低通)

The Nine

delphi调用matlab神经网络函数newff

delphi中已经引用了这个activex控件,但执行时发现出错。

错误出现在 使用newff这个函数。

解决方法:

换用matlab 7.0.4 sp2 使用matlab自动化服务器。使用creatoleobject

delphi中已经引用了这个activex控件,但执行时发现出错。

错误出现在 使用newff这个函数。

解决方法:

换用matlab 7.0.4 sp2 使用matlab自动化服务器。使用creatoleobject

KingSilin

使用Matlab对灰度图像编程实现2D的傅里叶变换

1.     先载入一幅灰度图像,如下:


 (非灰度图)

2. 利用函数fft2,对其进行快速傅立叶变换, 并利用函数fftshift 将变换后的图像原点移动到频率矩形的中心。

3. 利用abs()函数来得到傅立叶频谱;angle()函数得到相位图;

4. 利用imshow 来可视化图像,观察图像的特点;...


1.     先载入一幅灰度图像,如下:

 (非灰度图)

2. 利用函数fft2,对其进行快速傅立叶变换, 并利用函数fftshift 将变换后的图像原点移动到频率矩形的中心。

3. 利用abs()函数来得到傅立叶频谱;angle()函数得到相位图;

4. 利用imshow 来可视化图像,观察图像的特点;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一.   结果(图像):

 

 

二.   分析说明:

1. 在载入图片的时候要注意图片要存放到该文件的文件夹中。

2. 下载的图片看似是灰度图,实际上并非是灰度图,所以加多了一句代码“A=rgb2gray(A)”

 

三.   附件程序

A=imread('1.jpg'); %载入图片

A=rgb2gray(A)

B=fftshift(fft2(A));% 进行傅立叶变换

subplot(231)

imshow(A);

title('原始图像');

subplot(232)

imshow(abs(B),[]);

title('原始频谱图');

subplot(233)

imshow(log(abs(B)),[]);

title('取对数后的频谱图');

subplot(234)

imshow(angle(B),[]);

title('相位图');

subplot(235)

imshow(real(B),[]);

title('实部图');

subplot(236)

imshow(imag(B),[]);

title('虚部图');

colormap(jet(64)) %给图片上色

来源:罗韵

alameda

使用Java、Matlab画多边形闭合折线图

http://www.cnblogs.com/xudong-bupt/p/3182953.html

转载,感谢作者


使用Java、Matlab画多边形闭合折线图

  由于写论文要将“哈密顿回路问题(TSP)”的求解中间结果表示出来,查了一下使用程序画多边形图形。现在在总结一下,这个图是“由给定节点首尾相连的”闭合多边形。

1.使用matlab作闭合多边形图

  没有找到直接画多边形的函数,只能是将各个点的坐标保存在数组中,将一个点与其相邻的点相连,并将最后一个点与第一个点连接。下面是一个示例的.m文件:

clear; clc; a=[0 2 4 6 8 10 12 14;0 2...
http://www.cnblogs.com/xudong-bupt/p/3182953.html

转载,感谢作者


使用Java、Matlab画多边形闭合折线图

  由于写论文要将“哈密顿回路问题(TSP)”的求解中间结果表示出来,查了一下使用程序画多边形图形。现在在总结一下,这个图是“由给定节点首尾相连的”闭合多边形。

1.使用matlab作闭合多边形图

  没有找到直接画多边形的函数,只能是将各个点的坐标保存在数组中,将一个点与其相邻的点相连,并将最后一个点与第一个点连接。下面是一个示例的.m文件:

复制代码

clear; clc; a=[0 2 4 6 8 10 12 14;0 2 1 4 6 6 5 7]; %要连接的点坐标 x;y [n,m]=size(a); for i=1:m-1; line([a(1,i),a(1,i+1)],[a(2,i),a(2,i+1)]); %连接节点line([x1,x2],[y1,y2]) hold on end hold on line([a(1,1),a(1,m)],[a(2,1),a(2,m)]); %首尾节点相连

复制代码

 2.使用Java作闭合多边形图

  Java中的Graphics类drawPolygon函数提供了直接的多边形作图。

  函数原型:public abstract void drawPolygon(int[] xPoints, int[] yPoints,int nPoints)

   说明:(1)绘制一个由 x 和 y 坐标数组定义的闭合多边形。每对 (x, y) 坐标定义了一个点。nPoints表示线段的个数。

       (2)前面的 nPoint - 1 个线段是当 1 ≤ i ≤ nPoints 时,从 (xPoints[i-1], yPoints[i-1]) 到 (xPoints[i], yPoints[i]) 的线段。如果最后一个点和第一个点不同,则图形会通过在这两点间绘制一条线段来自动闭合。

  代码示例如下:

复制代码

import java.applet.*; import java.awt.*; public class DrawPicture extends Applet { public void paint(Graphics g) { int px[]={20,70,130,240}; int py[]={20,150,100,130}; g.drawPolygon(px,py,4); } }

复制代码

  执行结果:

  

3.说明

  是否能构成多边形,凸多边形,还是凹多边形,这些与给定的点的顺序有关。

  程序只是负责将相邻的节点连接, 以及首尾连接。

天河

matlab矩阵和矩阵操作基础

matlab命令集矩阵和矩阵操作基础-->矩阵和数组基础

blkdiag   :构造一个分块对角矩阵 
eye       :创建单位矩阵 
linespace :产生线性间隔向量 
logspace  :产生对数间隔向量 
ones      :产生元素全为1的数组 
rand      :产生均匀分布随机数组 
randn   ...

matlab命令集矩阵和矩阵操作基础-->矩阵和数组基础

blkdiag   :构造一个分块对角矩阵 
eye       :创建单位矩阵 
linespace :产生线性间隔向量 
logspace  :产生对数间隔向量 
ones      :产生元素全为1的数组 
rand      :产生均匀分布随机数组 
randn     :产生正态分布随机数组 
zeros     :产生全零数组 

matlab命令集:矩阵和矩阵操作基础-->特殊变量和常量

ans       :对最近输入的反应 
computer  :当前计算机类型 
eps       :浮点精度 
flops     :计算浮点操作次数,现已不再常用 
i         :虚部单位 
inf       :无穷大 
inputname :输入参数名 
j         :虚部单位 
nan       :非数值 
nargin    :输入参数的数目 
nargout   :输出参数的数目(用户定义函数) 
pi        :圆周率 
realmax   :最大正浮点数 
realmin   :最小正浮点数 
varargin,varargout:返回参数数目(matlab函数) 

matlab命令集:矩阵和矩阵操作基础-->时间和日期

calendar    :返回日历 
clock       :当前时间 
cputime     :从启动经过的cpu时间 
date        :日期 
datenum     :转换成连续日期数 
datestr     :日期字符串 
datevec     :日期分隔部分 
eomday      :一个月的日期 
etime       :经过的时间 
now         :当前的日期和时间 
tic, toc    :秒表定时器 
weekday     :星期几 

matlab命令集:矩阵和矩阵操作基础-->矩阵操作

cat         :把矩阵按行或列连接起来 
diag        :给定向量,构造对角矩阵 
fliplr      :矩阵左右翻转 
flipud      :矩阵上下翻转 
repmat      :复制数组,repmat(A,m,n)表示把A复制m行n列组成新数组 
reshape     :按逐列来的方式重新整形数组 
rot         :按逆时针方向旋转90度 
tril        :返回一个矩阵的下三角矩阵 
triu        :返回一个矩阵的上三角矩阵 

matlab命令集:矩阵和矩阵操作基础-->特殊函数矩阵

compan      :返回向量的伴随矩阵 
eig         :矩阵特征值 
gallery     :测试矩阵,或者说大约50个矩阵模版 
hadamard    :哈达马得矩阵 
hankel      :汉克尔矩阵 
hilb        :希尔波特矩阵 
invhilb     :逆希尔波特矩阵 
magic       :魔术方阵 
pascal      :帕斯卡矩阵 
toeplitz    :托普利茨矩阵 
wilkinson   :维尔金森特征值测试矩阵 

 

 

声音处理命令

函数名    功能描述    函数名    功能描述
soond    将向量转换成声音    wavread    读。wav文件
auread    读。au文件    wavwrite    写。wav文件
auwrite    写。au文

日期与时间命令

函数名    功能描述    函数名    功能描述
now    以数字形式给出当前日期和时间    weekday    星期函数
date    以字符转形式给出当前日期    eomday    月末日判断函数
clock    以向量形式给出当前日期和时间    cputime    所用CPU的时间
datenum    日期的数字形式转换    tic    启动秒表计时器
datestr    日期的字符串形式转换    toc    读取秒表计时器
datevec    日期的向量形式转换    etime    使用时间函数
calendar    日历函数    pause    暂停函数

字符串处理函数命令

字符串处理
函数名    功能描述    函数名    功能描述
strings    Matlab字符串函数说明    upper    字符串大写
isstr    字符串判断    lower    字符串小写
deblank    删除结尾空格    isletter    字母判断
str2mat    字符串转换成文本    isspace    空子符判断
strcmp    字符串比较    strrep    字串查找
findstr    字串查找    strtok    标记查找

字符串与数值转换
函数名    功能描述    函数名    功能描述
num2str    变数值为字符串    sprintf    数值的格式输出
str2num    变字符串为数值    sscanf    数值的格式输入
int2str    变整数为字符串         

进制转换
函数名    功能描述    函数名    功能描述
hex2num    十六进制到IEEE标准下浮点数的轮换    hex2dec    十六进制到十进制的轮换
dec2hex    十进制到十六进制的轮换   


J.Song 梦想弥足珍贵

matlab狂魔爱党的最高境界就是为了看学工部的党史,花了一个多小时编了个程序,把网站的党史全部下下来啦⊙▽⊙π_π⊙▽⊙

matlab狂魔爱党的最高境界就是为了看学工部的党史,花了一个多小时编了个程序,把网站的党史全部下下来啦⊙▽⊙π_π⊙▽⊙

yubo_917

Matlab 如何显示中文(适合中文的字体)

File/Preferences/Fonts/ 字体选择Monospaced 即可
File/Preferences/Fonts/ 字体选择Monospaced 即可
未命名

使用matlab做分布式并行运算

License Manager安装

使用MDCE引擎建立集群,需要获得Mathworks公司的授权。Licence Manager可以通过Network方式下安装,在standalone方式下安装是没有的。在一个集群中只要一个Node安装License Manager,其它节点就可以获得授权。

  • 安装参考

选择network安装

1) choose "install manually without using the internet"        
2) enter the...

License Manager安装

使用MDCE引擎建立集群,需要获得Mathworks公司的授权。Licence Manager可以通过Network方式下安装,在standalone方式下安装是没有的。在一个集群中只要一个Node安装License Manager,其它节点就可以获得授权。

  • 安装参考

选择network安装

1) choose "install manually without using the internet"        
2) enter the "file installation key"   xxxxx-xxxxx-xxxxx-xxxxx-xxxxx
3) check out "license manager" option
4) use "license_server.dat" when asked for license file

  • 启动参考

Windows Platform

1) 以管理员模式运行$MATLABROOT$/flexlm/lmtools.exe
2) 选择Start/Stop Reread标签,单击Start Server

Linux&Unix Platform

1) 在$MATLAB$/etc/license.dat中有SERVER一栏,后面填入your hostname
2) 将license server的端口设置成27000
3) 设置DAEMON MLM为DAEMON MLM $MATLAB$/etc/lm_matlab
4) 设置OPTIONS=$MATLAB$/etc/lmopts.sh
5) 用普通用户运行./lmstart,开启License Manager

分布式计算引擎(MDCE)安装

安装启动MDCE

  • Windows Platform

1) 用管理员启动cmd.exe, cd %MATLABROOT%/toolbox/distcomp/bin
2) 修改mdce_def.bat, 设置MDCEUSER=./%username%, %username%是你的登入帐号
3) 运行mdce.bat install, 输入帐号密码
4) 运行mdce.bat start, 启动Matalb Distributed Computing Server
5) WIN+R,输入services.msc,查看MDCS是否启动
6) 运行addMatlabToWindowsFirewall.bat, 配置防火墙,开放MDCE服务

说明windows服务默认Local System帐号启动,用Local System启动的服务是没有权限访问UNC(Universal Naming Convention)命名约定的网络资源,UNC格式为\\servername[server IP]\sharename\directory\filename。MDCE中传输和共享文件都是使用UNC命名约定,因此要使MDCE支持文件共享,启动它的用户需要有权限访问UNC网络资源。为了配置方便,用登入帐号启动MDCE服务,就可以访问共享资源。

  • Linux&Unix Platform

1) $cd $MATLABROOT$/toolbox/distcomp/bin
2) #./mdce install
3) #./mdce start
4) config iptables, make input chain ports tcp(135,139,445) and udp(137,138) open

说明在UNIX LIKE的系统中mdce是以ROOT身份启动的,可以轻松访问UNC格式的网络资源。

  • DNS设置

MDCE引擎使用机器名(hostname)在各个节点之间通信。为了能够正确解析集群中所有的node,需要在各个node的hosts文件中添加集群中所有机器的ip和hostname的映射条目。

调度程序(Job Manager)和work node启动配置

先准备几台将用来做分布式计算的计算机构建一个成局域网。打开Admin Center可视化界面进行配置。可以直接双击分布式工具箱(distcomp)的bin目录下的admincenter.bat文件也可以输入以下命令行

        命令:admincenter.bat

        弹出界面,配置主机:

        点击Add or Find按钮,再出来的界面中输入你将用来做分布式计算的计算机的IP地址,这里我只配了两台,IP地址分别为192.168.0.104,192.168.0.105。输完所有的IP地址后,点击Ok。

        接下来一直下一步(Next),最后Start。

    

 

     

    配置完主机后,开始创建任务管理。在MATLAB Job Scheduler(MJS)中,点击Start,为MJS输入一个名称:例如myjob。

        创建worker,selectAll,为每台主机创建2个workers,总共6个workers,ok!

 

 

文件共享设置

在一个集群内网络中主要有三种流量,代码,数据,运行时通信。在Matlab集群中,运行时通信对于Client是透明的,用户需要设置的是如何共享代码和数据。代码可以通过Job Manager传输到各个节点上,代码的大小相对来说比较小,网络传输开销小,而对于数据来说,不可能把数据在每一个Worker node节点上都复制一份拷贝,这样开销太多了。

1. 通过Job Manager传输代码

set(job, 'FileDependencies', {'fun1.m','fun2.m','main.m'})

2. 设置文件关联,让Worker node访问网络文件和本地文件

set(job, 'PathDependencies', {'\\ip\sharedir\','/mnt/'})

3. 使用Configurations Manager设置

Configurations Manager是Matlab中提供的图形化配置管理软件,使用此功能可以方便地配置常用的Job Manager,而不用每次运行都在代码中加入set函数。

在matlab的菜单栏上选择Parallel->Manage Configurations..., 启动Configurations Manager,设置jobmanager的属性(Properties...)

在我们的集群中大多数是基于Windows的系统,采用windows的共享文件机制就可以在各个windows系统间实现文件的共享。对于linux节点,就需要安装samba,然后将网络文件mount到local路径。

  • Windows共享文件设置
  • Linux&Unix共享文件设置

安装参考: [Samba wiki]

挂载Windows共享文件

#mount -t smbfs //ip/share /mnt/

提供本机文件共享,samba设置

[global]
  ...
  security=share
[sharedir]
  ...
  public = yes

编写并行应用程序

任务级并行

  • 流程

1) 搜索JM,创建对象: findResource()

% MyJobManager 表示JM的名字
% MyJMhost 表示运行该JM的主机名或IP地址
jm  =  findResource('scheduler','type','jobmanager','Name','MyJobManager','LookupURL','MyJMhost')

使用findResource函数时,省略所有property和value,可搜索所有局域网内可用的JM

all_managers = findResource('scheduler','type','jobmanager')

2) 创建Job: createJob()

虽然这个函数在client会话中执行,但实际上是在名叫jm的Job Manager上创建了一个名叫job1的Job

job  =  createJob(jm)

3) 分配Task: createTask()

在创建Job之后,使用createTask函数为该Job创建Task。Task定义了Worker所要执行的函数。在本例中,每个Task将会生成3*3的随机数矩阵。

createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});

也可用以下方法生成5个Task:

T = createTask(job, @rand, 1, {{3,3} {3,3} {3,3} {3,3} {3,3}});

4) 提交工作: submit()

使用submit函数提交Job到Job Manager,Job Manager将Task分配到已注册的Worker上并开始执行。

submit(job);

5) 等待: waitForState()

waitForState(job, 'finished');

6) 取回计算结果: getAllOutputArguments()

计算结果存储在每个任务对象的OutputArguments属性中,使用getAllOutputArguments取回所有的结果,运算结果以cell数组的形式返回。

results = getAllOutputArguments(job);

  • 完整示例

clear all;
% 寻找资源。
jm = findResource('scheduler', 'type', 'jobmanager', 'name', 'myJM', 'LookupURL', '192.168.0.100');
% 使用刚才找到的资源建立一个工作
job = createJob(jm);
% 设置该工作的文件关联,让所有workers都可以找到原程序文件,需要在Client上设置共享文件夹。
set(job, 'PathDependencies', {'\\192.168.0.101\matlab_code\', '/mnt/'})
% 另一种方法,把用到的原程序文件传给所有workers。
% set(job, 'FileDependencies', {'hm.m'});
N = 5;
M = 4;
% 建立4个任务,每任务都是算hp(M, N)。
createTask(job, @hp, 1, {{M, N}, {M, N}, {M, N}, {M, N}});
% 提交工作给jobmanager。
submit(job)
% 等待所有workers都把任务做完。
waitForState(job, 'finished')
% 取出计算结果。
results = getAllOutputArguments(job);
% 销毁Job,释放资源
destroy(job);

 

PS:会遇到的一点小问题,就是要把对应主机名和ip写入hosts,否者会出奇怪的错误

未命名

【转】Matlab中保存图像时,图形窗口大小的控制

首先要了解的是Matlab是面向对象的。最高等级的对象是screen,它定义了figure可以用的最大szie。
screen下面是figure。figue就是你画图的时候跳出来的那个新的对话窗口。如果figure变化,screen是不会跟着变化的。但screen变化的话,figure就要跟着变化了。
 

figure下面是axes。axes是那个窗口里面你要画的东西。axes的大小和位置取决于figure,如果你放大缩小figure的大小的话,里面的图线也会跟着变化的。

set(gca,'position',[])

因此,set (gca,'position',[0.1,0.1,...

首先要了解的是Matlab是面向对象的。最高等级的对象是screen,它定义了figure可以用的最大szie。
screen下面是figure。figue就是你画图的时候跳出来的那个新的对话窗口。如果figure变化,screen是不会跟着变化的。但screen变化的话,figure就要跟着变化了。
 

figure下面是axes。axes是那个窗口里面你要画的东西。axes的大小和位置取决于figure,如果你放大缩小figure的大小的话,里面的图线也会跟着变化的。

set(gca,'position',[])

因此,set (gca,'position',[0.1,0.1,0.9,0.9] );的作用是:

设置坐标轴距离画板(图形窗口figure)边距。

[0.1,0.1,0.9,0.9] 分别为axes在figure中的左边界,下边界,宽度,高度,最小为0,最大为1(左边界,下边界为0,上边界,右边界为1)

见下面的例子:

-----------------------------------------------------------------------------

figure

 set (gca,'position',[0.1,0.1,0.9,0.9] );

 x=1:0.1:10; 
y=sin(x);
plot(x,y)

-----------------------------------------------------------------------------

结果见下图:

【转】Matlab中保存图像时,图形窗口大小的控制 - jenny_e_e - 代码是指尖的精灵

set(gcf,'position',[])

一般matlab绘出来图的框架(图形窗口)大都是正方形或者近似正方形的矩形,能不能画一些扁的矩形呢?

使用图形的position属性可以做到。

如set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);的意思是:

对gcf的position进行设置。使其在屏幕上的显示位置是以(0.2,0.2)为原点,长0.64,宽0.32。同gca一样,仍然是左边界,下边界为0,

上边界,右边界为1。

另外,gcf的position也可以不是normalized的。如下面的例子:

-----------------------------------------------------------------------------

x=-2*pi:0.1:2*9i;y=sin(x);figure;set (gcf,'Position',[500,500,500,500], 'color','w') %大小设置plot(x,y,'k-') %节点位移图形输出xlim([min(s(:,2)) max(s(:,2))])grid on

-----------------------------------------------------------------------------

其中,

[500,500,500,500]的意思为:原点的位置x,原点的位置y,宽,高,其坐标为points(详见下面),

 


现在问题还存在:

如果仅设置position的话,打印的时候还是正方形。可以用下面的方法解决:

通常默认情况下,print命令输出图像为 8*5inches,无视屏幕显示尺寸
通过命令行修改的话有三步

1 设置paperposition为manual
set(gcf,'PaperPositionMode', 'manual')
[ auto | {manual} ]

2 设置paperunit   
set(gcf,'PaperUnits','inches')
[ {inches} | centimeters | normalized | points ]

3 设置paperposition
set(gcf,'PaperPosition',[left,bottom,width,height])

例如
set(gcf, 'PaperPositionMode', 'manual');
set(gcf, 'PaperUnits', 'points');
set(gcf, 'PaperPosition', [0 0 640 480]);

 

还有一个相关命令是papersize
paperposition 是placement,代表图像在paper(感觉就是屏幕screen的意思?)中的所处位置。left和bottom计算好,就可以使图像在paper中居中
papersize是纸张大小;position要比size小的

【转】Matlab中保存图像时,图形窗口大小的控制 - jenny_e_e - 代码是指尖的精灵

PaperPosition
    four-element rect vector
    Location on printed page. A rectangle that determines the location of the figure on the printed page. Specify this rectangle with a vector of the form
     rect = [left, bottom, width, height]
    where left specifies the distance from the left side of the paper to the left side of the rectangle and bottom specifies the distance from the bottom of the page to the bottom of the rectangle. Together these distances define the lower-left corner of the rectangle. width and height define the dimensions of the rectangle. The PaperUnits property specifies the units used to define this rectangle.


要使图像比例输出与屏幕显示的一致,可以使用如下命令
屏幕显示图像尺寸可以plot时用 set(gcf,'position',[left bottom width height]) 调整,或者print之前拖动窗口手动调整

This example exports a figure at screen size to a 24-bit TIFF file, myfigure.tif.

 

% set(gcf,'position',[80 100 800 600])  % 如果手动拖放,则不需要这一行命令
set(gcf, 'PaperPositionMode', 'auto')   % Use screen size
print -dtiff myfigure



用matlab画了一张图,投稿时要缩小,缩小后字体就会过小或者发虚。我摸索出比较好的方法是如下的代码:%%%%%%%%%%%%%%%%%%%%%%plot your figure before%%%%%%%%%%%%%%%%%%%%%% figure resize
set(gcf,'Position',[100 100 260 220]);
set(gca,'Position',[.13 .17 .80 .74]);
figure_FontSize=8;
set(get(gca,'XLabel'),'FontSize',figure_FontSize,'Vertical','top');
set(get(gca,'YLabel'),'FontSize',figure_FontSize,'Vertical','middle');
set(findobj('FontSize',10),'FontSize',figure_FontSize);
set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%解释:set(gcf,'Position',[100 100 260 220]);
这句是设置绘图的大小,不需要到word里再调整大小。我给的参数,图的大小是7cmset(gca,'Position',[.13 .17 .80 .74]);
这句是设置xy轴在图片中占的比例,可能需要自己微调。figure_FontSize=8;
set(get(gca,'XLabel'),'FontSize',figure_FontSize,'Vertical','top');
set(get(gca,'YLabel'),'FontSize',figure_FontSize,'Vertical','middle');
set(findobj('FontSize',10),'FontSize',figure_FontSize);这4句是将字体大小改为8号字,在小图里很清晰set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);

这句是将线宽改为2


同步自网易博客 (查看原文)

浦原氏之喵
用这张全新安装的软件图,来成为...

用这张全新安装的软件图,来成为我这里的第一篇日志。Yoruichi大人(或者Herby大人,或者夜一大人,或者Y大人),早晚会是女神。从今年进BNU开始。

我们的征途是星辰大海。

附:

MatlabR2014a(中文版)

下载地址: http://pan.baidu.com/s/1qW9ADnm 密码: crv5

破译文件: http://pan.baidu.com/s/1ntFgyRB 密码: kjhq

安装说明:http://tieba.baidu.com/p/2958354100

用这张全新安装的软件图,来成为我这里的第一篇日志。Yoruichi大人(或者Herby大人,或者夜一大人,或者Y大人),早晚会是女神。从今年进BNU开始。

我们的征途是星辰大海。

附:

MatlabR2014a(中文版)

下载地址: http://pan.baidu.com/s/1qW9ADnm 密码: crv5

破译文件: http://pan.baidu.com/s/1ntFgyRB 密码: kjhq

安装说明:http://tieba.baidu.com/p/2958354100

gdnqjssys

MATLAB聚类分析

1. 简介

        MATLAB的统计工具包提供了许多强大的功能,其中就包括cluster analysis,即聚类分析。利用MATLAB封装的函数库,我们很容易开展多种聚类的实验。

        MATLAB的距离分析方法主要有两种:1)层次聚类;2)k-means聚类。简而言之,MATLAB利用聚类树,将数据聚合为不同的组。通常来说,一棵树不止一层,利用聚类树,数据也被聚类为不同的层次。如果自底向上考虑,聚类树的叶子节点就是独立的数据,在这些叶子节点之上,通过比较这些数据的“距离”,把足...

1. 简介

        MATLAB的统计工具包提供了许多强大的功能,其中就包括cluster analysis,即聚类分析。利用MATLAB封装的函数库,我们很容易开展多种聚类的实验。

        MATLAB的距离分析方法主要有两种:1)层次聚类;2)k-means聚类。简而言之,MATLAB利用聚类树,将数据聚合为不同的组。通常来说,一棵树不止一层,利用聚类树,数据也被聚类为不同的层次。如果自底向上考虑,聚类树的叶子节点就是独立的数据,在这些叶子节点之上,通过比较这些数据的“距离”,把足够相近的数据聚合,形成一个高级的簇。越高级的簇,包含的数据越多。根节点是一个包含了所有数据的一个簇。这种聚类的好处是,可以让用户子定义聚类程度或条件。k-means聚类方法就是在一个数据空间中,将数据分类,使同一个类的数据尽量接近,而不同类的数据尽量远离。k-means聚类与分层聚类不同的是,k-means依据实际数据,将所有的数据分入同一层次的簇中,而分层聚类将数据聚合到多种层次的不同簇中。

2. 使用方法

2.1 层次聚类

        MATLAB为层次距离提供了两套接口,一种是简洁型,调用clusterdata,一键搞定;另一种是分步型,就是提供了三个函数pdist, linkage, cluster。它们的功能分别为计算任意两条数据之间的距离,将数据聚合到一棵聚合树上,将聚合树划分为几个簇。这些工作是分步将clusterdata的工作完成。第一种方法当然简单,但是利用第二种方法,你可以指定更多方法,比如定义两条数据间距离,定义聚类方法等,相对而言更加灵活。这里主要讲述第二种方案。主要步骤为以下四步。

准备数据

       根据要求,数据是需要存储在一个矩阵 M中,矩阵的大小则由数据量和组织形式而定。若有n条数据(或观察),每条数据包括p个属性,则矩阵M的大小就是n * p.

       有了基础数据,就需要计算这些数据之间的距离。距离计算方法有很多,MATLAB提供了形如欧几里得距离,标准化欧几里得距离,城市距离等多种计算方法。如果满足要求,大可以利用已有方案;若没有,则可以参考说明,定义自己的距离计算方法。如果使用内置的距离计算方法,则调用

D = pdist(M,distance)

即可。其中M为数据矩阵,如果调用内置距离计算方法,distance取'euclidean'即可;若调用自定义的方法,distance为'@your-distance-function-name'。返回值D是一个1行, m * (m - 1) / 2列的行向量。为某两条数据之间的距离。为了节省空间,这些数据被压缩到一个行向量存储。调用squareform方法可以将这些数据转为矩阵的形式,看起来就比较直观了。

生成聚合树

       计算得到数据间距离后,就可以对这些数据进行分类了。此时,需要调用

Z = linkage(D)

方法。返回值Z为三列的矩阵,形如

Z =

4.0000 5.0000 1.0000
1.0000 3.0000 1.0000
6.0000 7.0000 2.0616
2.0000 8.0000 2.5000

其中,第1,2列是参加聚类的簇编号,第3列为这两个簇的距离。当然,Z应当是依据第三列,从小到大组织结果的。假设原先有5条数据,标号为1-5,在叶子的层次上,每条数据自成一簇。由于4,5距离近,则合并,同理,1,3也合并。每个簇的编号在这个分类过程中必须是独一无二的,则可以接受簇6是4,5合并而成,7为1,3合并而成,6,7合并为8,与2合并。

分类


检查分类结果


2.2 k-means聚类

時の砂漠

【转】--- 解决.m文件默认打开方式不能设置为MATLAB的方法(MATLAB 2019b)

最近更新matlab2019b后发现无论用什么方法

比如 右键-打开方式-添加matlab.exe等方式,都无法将matlab.exe添加到可以打开的程序中。

所以.m文件只能通过先打开matlab,然后再在matlab资源管理器中找到相应的.m文件,

然后才能打开。

这样太麻烦了。没想到网络上已经有大神给出了解决办法。

这里分享一下,以做备份。


原文地址:https://blog.csdn.net/yaningli/article/details/84538798


这里作为该文章的转载

内容:

1. 将下面代码复制保存为 associateFiles...

最近更新matlab2019b后发现无论用什么方法

比如 右键-打开方式-添加matlab.exe等方式,都无法将matlab.exe添加到可以打开的程序中。

所以.m文件只能通过先打开matlab,然后再在matlab资源管理器中找到相应的.m文件,

然后才能打开。

这样太麻烦了。没想到网络上已经有大神给出了解决办法。

这里分享一下,以做备份。


原文地址:https://blog.csdn.net/yaningli/article/details/84538798


这里作为该文章的转载

内容:

1. 将下面代码复制保存为 associateFiles.m 文件。

2. 在MATLAB中运行 associateFiles.m 文件,即在命令行中输入 associateFiles 然后 回车。

3. 执行步骤2后,程序运行会生成文件 MatlabFileAssocFix.reg

4. 关闭MATLAB,双击运行 MatlabFileAssocFix.reg 。

5. 设置.m文件默认打开程序为MATLAB2019b 完工。



代码:

  1. function associateFiles(action, userExtList, fileStr)

  2. % associateFiles(action, extList, fileStr)

  3. %

  4. % Makes a registry files that can be used to set correct file associantions on

  5. % a windows platform. The following MATLAB file extensions are supported:

  6. % .m, .mat, .fig, .mexw32, .mexw64, .p, .mdl, .mdlp, .slx, .mldatx, .req,

  7. % .sldd, .slddc, .slxp, .sltx, .mn, .mu, .muphlp, .xvc, .xvz, .ssc, .mlapp,

  8. % .mlappinstall, .mltbx, .mlpkginstall, .mlprj

  9. %

  10. % INPUT:

  11. % action  - optional string. 

  12. %           * 'add' (default) adds/rewrites the MATLAB file association registry

  13. %              keysfor this version.

  14. %           * 'delete' deletes the MATLAB file association registry entries for

  15. %              ALL versions of MATLAB (including "old style" ones)

  16. %           * 'deleteadd' is the same as 'delete' followed by 'add'

  17. % extList - optional string or cell array of strings containing the file

  18. %           extensions that should be associated with this version. Default is

  19. %           all MATLAB file extension (see above).

  20. % fileStr - optional string with the name of the registry file to be written

  21. %           (possibly including path). Default is the file

  22. %           'MatlabFileAssocFix.reg' in the current directory.

  23. %

  24. % USAGE:

  25. % 1) Run with desired options (see above). A registry file should have been

  26. %    created. 

  27. % 2) Exit all running instances of MATLAB.

  28. % 3) Make a backup copy of the windows registry if you need to restore the

  29. %    changes, see https://support.microsoft.com/en-us/kb/322756

  30. % 4) Double click on the created file (possibly need to enter a password) and

  31. %    confirm.

  32. % 5) Restart Windows (or explorer.exe).

  33. % 6) The MATLAB files should now be associated with the MATLAB version that the

  34. %    registry file was created in and e.g. m-files should be opened in an

  35. %    already running instance of MATLAB.

  36. %

  37. % EXAMPLES:

  38. % * associateFiles('deleteadd') - Makes a registry files that deletes all

  39. %   previous MATLAB file association registry keysandwrite new ones that

  40. %   associates all MATLAB files with the MATLAB version that the registry file

  41. %   was created in.

  42. % * associateFiles('', {'.m', '.mat', '.fig'}, 'myFile') - Makes a registry file

  43. %   "myFile.reg" that associates m-, mat- and fig-files with the MATLAB version

  44. %   that the registry file was created in. 

  45. %

  46. % VERSION 1.0

  47. % Defualt input

  48. if (nargin < 1 || isempty(action))

  49.   action      = 'add';

  50. end

  51. if (nargin < 2)

  52.   userExtList = {};

  53. end

  54. if (nargin < 3)

  55.   fileStr = '';

  56. end

  57. if (~iscell(userExtList))

  58. if (isempty(userExtList))

  59.     userExtList = {};

  60. else

  61.     userExtList = {userExtList};

  62.   end

  63. end

  64. % Sanity check

  65. if (~ischar(action) || (~strcmpi(action, 'add') && ...

  66.     ~strcmpi(action, 'delete') && ~strcmpi(action, 'deleteadd')))

  67.   error('The action to perform must be ''add'', ''delete'' or ''deleteadd''!')

  68. end

  69. if (~isempty(userExtList) && ~min(cellfun(@ischar, userExtList)))

  70.   error('The file extension list must be a string or a cell array of strings!')

  71. end

  72. if (~ischar(fileStr))

  73.   error('The file to write to must be a string!')

  74. end

  75. % Get the currently running MATLAB version

  76. verStr = regexp(version, '(\d*?\.\d*?\.\d*?)\.', 'tokens');

  77. verStr = verStr{1}{1};

  78. verNum = str2double(regexprep(verStr, '(\d*?\.\d*)[\x0000-\xffff]*', '$1'));

  79. verHex = sprintf('x', str2double(regexprep(verStr, ...

  80. '(\d*?)\.[\x0000-\xffff]*', '$1')), str2double(regexprep(verStr, ...

  81. '\d*?\.(\d*?)\.[\x0000-\xffff]*', '$1')));

  82. % Get 32/64-bit

  83. arch = computer;

  84. switch arch

  85.   case 'PCWIN'

  86.     binFolder = 'win32';

  87.   case 'PCWIN64'

  88.     binFolder = 'win64';

  89. end

  90. binPath = fullfile(matlabroot, 'bin', binFolder);

  91. % Known MATLAB files with possible DDE actions

  92. fileExtCell = {...

  93. 'fig' ,   'MATLAB Figure'              , '-62'                       , ...

  94.   {'Open', 'uiopen(''%1'',1)'}           , []                          ; ...

  95. 'm'     , 'MATLAB Code'                , '-58'                       , ...

  96.   {'Open', 'uiopen(''%1'',1)'}           , {'Run', 'run(''%1'')'}      ; ...

  97. 'mat'   , 'MATLAB Data'                , '-59'                       , ...

  98.   {'Load', 'load(''%1'')'    }           , {'Open', 'uiimport(''%1'')'}; ...

  99. 'mdl'   , 'Simulink Model'             , '-61'                       , ...

  100.   {'Load', 'uiopen(''%1'',1)'}           , []                          ; ...

  101. 'mdlp'  , 'Simulink Protected Model'   , '-72'                       , ...

  102.   []                                     , []                          ; ...

  103. 'mexw32', 'MATLAB MEX'                 , '-63'                       , ...

  104.   []                                     , []                          ; ...

  105. 'mexw64', 'MATLAB MEX'                 , '-63'                       , ...

  106.   []                                     , []                          ; ...

  107. 'mn'    , 'MuPAD Notebook'             , '-66'                       , ...

  108.   {'Open', 'mupad(''%1'')'}              , []                          ; ...

  109. 'mu'    , 'MuPAD Code'                 , '-67'                       , ...

  110.   {'Open', 'uiopen(''%1'',1)'}           , []                          ; ...

  111. 'muphlp', 'MuPAD Help'                 , '-68'                       , ...

  112.   {'Open', 'doc(symengine, ''%1'')'}     , []                          ; ...

  113. 'p'     , 'MATLAB P-code'              , '-60'                       , ...

  114.   []                                     , []                          ; ...

  115. 'slx'   , 'Simulink Model (SLX format)', '-73'                       , ...

  116.   {'Open', 'uiopen(''%1'',1)'}           , []                          ; ...

  117. 'ssc'   , 'Simscape Model'             , '-65'                       , ...

  118.   {'Open', 'uiopen(''%1'',1)'}           , []                          ; ...

  119. 'xvc'   , 'MuPAD Graphics'             , '-69'                       , ...

  120.   {'Open', 'mupad(''%1'')'}              , []                          ; ...

  121. 'xvz'   , 'MuPAD Graphics'             , '-70'                       , ...

  122.   {'Open', 'mupad(''%1'')'}              , []                          ; ...

  123. 'mlapp'       , 'MATLAB Application'              , [] , [], []      ; ... 

  124. 'mltbx'       , 'MATLAB Toolbox'                  , [] , [], []      ; ... 

  125. 'mldatx'      , 'Simulink Scenario'               , [] , [], []      ; ...  

  126. 'req'         , 'Simulink Requirements Link'      , [] , [], []      ; ... 

  127. 'sldd'        , 'Simulink Dictionary'             , [] , [], []      ; ... 

  128. 'slddc'       , 'Simulink Dictionary'             , [] , [], []      ; ...      

  129. 'mlappinstall', 'MATLAB Application'              , [] , [], []      ; ...  

  130. 'mlpkginstall', 'MATLAB Support Package'          , [] , [], []      ; ... 

  131. 'slxp'        , 'Simulink Protected Model Package', [] , [], []      ; ... 

  132. 'sltx'        , 'Simulink Template'               , [] , [], []      ; ... 

  133. 'mlprj'       , 'MATLAB Project'                  , [] , [], []};

  134. % Possibly trim list

  135. if (~isempty(userExtList))

  136.   fileExtCell = fileExtCell(ismember(fileExtCell(:, 1), ...

  137.     regexprep(userExtList, '\.', '')), :);

  138. end

  139. % Make registry file

  140. if (~isempty(fileStr))

  141.   % Possibly add file extension

  142.   [~, ~, tmp] = fileparts(fileStr);

  143. if (isempty(tmp))

  144.     fileStr = [fileStr, '.reg'];

  145.   end

  146.   fid = fopen(fileStr, 'w');

  147. else

  148.   fid = fopen('MatlabFileAssocFix.reg', 'w');

  149. end

  150. if (fid == -1)

  151.   error('Failed to create registry file')

  152. end

  153. % Write intial lines

  154. fprintf(fid, '%s\r\n\r\n', 'Windows Registry Editor Version 5.00');

  155. fprintf(fid, '%s\r\n\r\n', ';FIXES MATLAB FILE ASSOCIATIONS');

  156. % REMOVE OLD KEYS

  157. explorerKey = ['HKEY_CURRENT_USER\Software\Microsoft\Windows\', ...

  158.   'CurrentVersion\Explorer\FileExts'];

  159. % Iterate over file extensions

  160. for fileExtNo = 1 : size(fileExtCell, 1)

  161.   rmKeys  = {};

  162.   fileExt = fileExtCell{fileExtNo, 1};

  163.   % File extension keys

  164.   [status, result] = dos(['reg query HKEY_CLASSES_ROOT /f .', fileExt, ...

  165.     ' /k /e']);

  166.   if (~status)

  167.     keys = regexp(result, '(HKEY_CLASSES_ROOT[\x0000-\xffff]*?)\n', 'tokens');

  168.     rmKeys = [rmKeys, keys{:}];

  169.   end

  170.   % Old style keys without version numbers

  171.   if (~strcmpi(fileExt, 'mexw64'))

  172.     % Uses single DDE key for mex files

  173.     if (strcmpi(fileExt, 'mexw32'))

  174.       fileExtTmp = 'mex';

  175.     else

  176.       fileExtTmp = fileExt;

  177.     end

  178.     [status, result] = dos(['reg query HKEY_CLASSES_ROOT /f ', ...

  179.       fileExtTmp, 'file /k /e']);

  180.     if (~status)

  181.       keys = regexp(result, '(HKEY_CLASSES_ROOT[\x0000-\xffff]*?)\n', ...

  182.         'tokens');

  183.       rmKeys = [rmKeys, keys{:}];

  184.     end

  185.   end

  186.   % New style keys with version number

  187.   if (strcmpi(action, 'add'))

  188.     % Only remove keys related to this version

  189.     [status, result] = dos(['reg query HKEY_CLASSES_ROOT /f MATLAB.', ...

  190.       fileExt, '.', verStr ' /k']);

  191.   else

  192.     % Remove keys related to ALL version

  193.     [status, result] = dos(['reg query HKEY_CLASSES_ROOT /f MATLAB.', ...

  194.       fileExt, '. /k']);

  195.   end

  196.   if (~status)

  197.     keys = regexp(result, '(HKEY_CLASSES_ROOT[\x0000-\xffff]*?)\n', 'tokens');

  198.     rmKeys = [rmKeys, keys{:}];

  199.   end

  200.   % Explorer keys

  201.   [status, result] = dos(['reg query ', explorerKey, ' /f .', fileExt, ...

  202.     ' /k /e']);

  203.   if (~status)

  204.     keys = regexp(result, '(HKEY_CURRENT_USER[\x0000-\xffff]*?)\n', 'tokens');

  205.     rmKeys = [rmKeys, keys{:}];

  206.   end

  207.   % Write to file

  208.   if (~isempty(rmKeys))

  209.     fprintf(fid, '%s\r\n\r\n', [';REMOVES ', upper(fileExt), ...

  210.       ' FILE ASSOCIATIONS']);

  211.     for keyNo = 1 : length(rmKeys)

  212.       key = rmKeys{keyNo};

  213.       fprintf(fid, '%s\r\n\r\n', ['[-', key, ']']);

  214.     end

  215.   end

  216. end

  217. % ADD KEYS

  218. if (~strcmpi(action, 'delete'))

  219.   % Get text Persistent Handler

  220.   [status, result] = dos(...

  221.     'reg query HKEY_CLASSES_ROOT\.txt\PersistentHandler /ve');

  222.   if (~status)

  223.     PersistentHandler = regexp(result, '\{[\x0000-\xffff]*?\}', 'match');

  224.     PersistentHandler = PersistentHandler{1};

  225.   else

  226.     PersistentHandler = '';

  227.   end

  228.   % DDE call

  229.   ddeCall = 'ShellVerbs.Matlab';

  230.   if (verNum > 8)

  231.     % Changed from R2013a

  232.     ddeCall = [ddeCall, '.', verStr];

  233.   end

  234.   % Default icon

  235.   defIcon = 'm';

  236.   if (~exist(fullfile(binPath, 'm.ico'), 'file'))

  237.     defIcon = '';

  238.   end

  239.   % Path to MATLAB binary directory with \\

  240.   binPathStr = regexprep(binPath, '\\', '\\\\');

  241.   % Write Shell Open key

  242.   key = ['[HKEY_CLASSES_ROOT\Applications\MATLAB.exe\shell\open', ...

  243.     '\command]%r', '@="\"', binPathStr, '\\MATLAB.exe\" \"%1\""%r%r'];

  244.   fprintf(fid, '%s\r\n\r\n', ';ADD SHELL OPEN');

  245.   lines = regexp(key, '([\x0000-\xffff]*?)%r', 'tokens');

  246.   for lineNo = 1 : length(lines)

  247.     fprintf(fid, '%s\r\n', lines{lineNo}{1});

  248.   end

  249.   % Iterate over file types

  250.   for fileExtNo = 1 : size(fileExtCell, 1)

  251.     fileExt = fileExtCell{fileExtNo, 1};

  252.     % File extension keys

  253.     key  = ['[HKEY_CLASSES_ROOT\.', fileExt, ']%r@="MATLAB.', fileExt, '.', ...

  254.       verStr, '"%r'];

  255.     if (strcmpi(fileExt, 'm') && ~isempty(PersistentHandler))

  256.       % Add some values

  257.       key = [key, '"Content Type"="text/plain"%r', ...

  258.         '"PerceivedType"="Text"%r'];

  259.     end

  260.     key = [key, '%r'];

  261.     key = [key, '[HKEY_CLASSES_ROOT\.', fileExt, ...

  262.       '\OpenWithProgids]%r"MATLAB.', fileExt, '.', verStr, '"=""%r%r'];

  263.     if (strcmpi(fileExt, 'm') && ~isempty(PersistentHandler))

  264.       key = [key, '[HKEY_CLASSES_ROOT\.', fileExt, ...

  265.         '\PersistentHandler]%r@="', PersistentHandler, '"%r%r'];

  266.     end

  267.     key  = [key, '[HKEY_CLASSES_ROOT\.', fileExt, ...

  268.       '\Versions\MATLAB.', fileExt, '.' verStr, ']%r"FileVersionMS"=dword:', ...

  269.       verHex, '%r"FileVersionLS"=dword:00000000%r%r'];

  270.     % DDE keys

  271.     ddeData = fileExtCell(ismember(fileExtCell(:, 1), fileExt), :);

  272.     key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  273.       ']%r@="', ddeData{2}, '"%r'];

  274.     if (~isempty(ddeData{3}))

  275.       key = [key, '"FriendlyTypeName"="@', binPathStr, '\\matlab.exe', ...

  276.         ',', ddeData{3}, '"%r'];

  277.     end

  278.     key = [key, '%r'];

  279.     % Icon

  280.     icon = fileExt;

  281.     if (~exist(fullfile(binPath, [icon, '.ico']), 'file'))

  282.       icon = defIcon;

  283.     end

  284.     if (~isempty(icon))

  285.       key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  286.         '\DefaultIcon]%r@="', binPathStr, '\\', icon, '.ico,0"%r%r'];

  287.     end

  288.     % Shell actions

  289.     for shellActionNo = 4:5

  290.       ddePar = ddeData{shellActionNo};

  291.       if (~isempty(ddePar))

  292.         key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  293.           '\Shell\', ddePar{1}, ']%r@="', ddePar{1}, '"%r%r'];

  294.         key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  295.           '\Shell\', ddePar{1}, '\command]%r@="\"', binPathStr, ...

  296.           '\\matlab.exe\""%r%r'];

  297.         key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  298.           '\Shell\', ddePar{1}, '\ddeexec]%r@="', ddePar{2}, '"%r%r'];

  299.         key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  300.           '\Shell\', ddePar{1},'\ddeexec\application]%r@="', ...

  301.           ddeCall, '"%r%r'];

  302.         key = [key, '[HKEY_CLASSES_ROOT\MATLAB.', fileExt, '.' verStr, ...

  303.           '\Shell\', ddePar{1},'\ddeexec\topic]%r@="system"%r%r'];

  304.       end

  305.     end

  306.     % Explorer keys

  307.     key = [key, '[', explorerKey, '\.', fileExt, '\OpenWithProgids]%r'];

  308.     if (strcmpi(fileExt, 'm'))

  309.       key = [key, '"m_auto_file"=hex(0):%r'];

  310.     end

  311.     key = [key, '"MATLAB.', fileExt, '.',  verStr, '"=hex(0):%r%r'];

  312.     if (~isempty(ddeData{4}))

  313.       % Add key

  314.       key = [key, '[', explorerKey, '\.', fileExt, ...

  315.         '\OpenWithList]%r"a"="MATLAB.exe"%r"MRUList"="a"%r%r'];

  316.     else

  317.       key = [key, '[', explorerKey, '\.', fileExt, '\OpenWithList]%r%r'];

  318.     end

  319.     % Write to file

  320.     fprintf(fid, '%s\r\n\r\n', [';ADD ', upper(fileExt), ...

  321.       ' FILE ASSOCIATIONS']);

  322.     lines = regexp(key, '([\x0000-\xffff]*?)%r', 'tokens');

  323.     for lineNo = 1 : length(lines)

  324.       fprintf(fid, '%s\r\n', lines{lineNo}{1});

  325.     end

  326.   end

  327. end

  328. % Cloese file

  329. fclose(fid);


MATLAB2019b 亲测有用。



LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息