EOF的源程序 MATLAB
- 格式:doc
- 大小:44.00 KB
- 文档页数:5
function hom[P,iter,err]=newton('f','JF',[7.8e-001;4.9e-001;3.7e-001],0.01,0.001,1000);disp(P);disp(iter);disp(err);function Y=f(x,y,z)Y=[x^2+y^2+z^2-1;2*x^2+y^2-4*z;3*x^2-4*y+z^2];function y=JF(x,y,z)f1='x^2+y^2+z^2-1';f2='2*x^2+y^2-4*z';f3='3*x^2-4*y+z^2';df1x=diff(sym(f1),'x');df1y=diff(sym(f1),'y');df1z=diff(sym(f1),'z');df2x=diff(sym(f2),'x');df2y=diff(sym(f2),'y');df2z=diff(sym(f2),'z');df3x=diff(sym(f3),'x');df3y=diff(sym(f3),'y');df3z=diff(sym(f3),'z');j=[df1x,df1y,df1z;df2x,df2y,df2z;df3x,df3y,df3z]; y=(j);function [P,iter,err]=newton(F,JF,P,tolp,tolfp,max) %输入P为初始猜测值,输出P则为近似解%JF为相应的Jacobian矩阵%tolp为P的允许误差%tolfp为f(P)的允许误差%max:循环次数Y=f(F,P(1),P(2),P(3));for k=1:maxJ=f(JF,P(1),P(2),P(3));Q=P-inv(J)*Y;Z=f(F,Q(1),Q(2),Q(3));err=norm(Q-P);P=Q;Y=Z;iter=k;if (err<tolp)||(abs(Y)<tolfp||abs(Y)<0.0001) breakendend<pre lang="matlab" line="1" file="test.m"> function homework4[P,iter,err]=newton('f','JF',[7.8e-001;4.9e-001;3.7e-001],0.01,0.001,1000);disp(P);disp(iter);disp(err);function Y=f(x,y,z)Y=[x^2+y^2+z^2-1;2*x^2+y^2-4*z;3*x^2-4*y+z^2];function y=JF(x,y,z)f1='x^2+y^2+z^2-1';f2='2*x^2+y^2-4*z';f3='3*x^2-4*y+z^2';df1x=diff(sym(f1),'x');df1y=diff(sym(f1),'y');df1z=diff(sym(f1),'z');df2x=diff(sym(f2),'x');df2y=diff(sym(f2),'y');df2z=diff(sym(f2),'z');df3x=diff(sym(f3),'x');df3y=diff(sym(f3),'y');df3z=diff(sym(f3),'z');j=[df1x,df1y,df1z;df2x,df2y,df2z;df3x,df3y,df3z]; y=(j);function [P,iter,err]=newton(F,JF,P,tolp,tolfp,max) %输入P为初始猜测值,输出P则为近似解%JF为相应的Jacobian矩阵%tolp为P的允许误差%tolfp为f(P)的允许误差%max:循环次数Y=f(F,P(1),P(2),P(3));for k=1:maxJ=f(JF,P(1),P(2),P(3));Q=P-inv(J)*Y;Z=f(F,Q(1),Q(2),Q(3));err=norm(Q-P);P=Q;Y=Z;iter=k;if (err<tolp)||(abs(Y)<tolfp||abs(Y)<0.0001) breakend。
1.Subscript indices must either be real positive integers or logicals 中文解释:下标索引必须是正整数类型或者逻辑类型出错原因:在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。
注:matlab 的语法规定矩阵的索引从1 开始,这与 C 等编程语言的习惯不一样。
解决办法:自己调试一下程序,把下标为 0 或者负数的地方修正。
2.Undefined function or variable "U"中文解释:函数或变量 U 没有定义.出错原因及解决办法:可能变量名输入错误,仔细检查3.Matrix dimensions must agree中文解释:矩阵的维数必须一致出错原因:这是由于运算符(= + - / * 等)两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。
matlab 通过“.”来区分矩阵运算和元素运算。
解决办法:自己调试一下程序,保证运算符两边的运算对象维数一致。
4.Function definitions are not permitted at the prompt or in scripts 中文解释:不能在命令窗口或者脚本文件中定义函数出错原因:一旦在命令窗口写 function c = myPlus(a,b),此错误就会出现,因为函数只能定义在 m 文件中。
关于脚本文件和 m 文件的区别请查阅 matlab 基础书。
简言之:1) 如果你写成 function 的形式,那么必须写在 m 文件中,且以 function 开头(即 function 语句前不能包含其他语句,所有语句必须放在 function 中,当然,function 的定义可以有多个,各 function 之间是并列关系,不能嵌套);2) 如果你写成脚本的形式,则既可以写在命令窗口中,也可以写在 m 文件中,但两者均不能包含 function 语句(即不能进行函数的定义)解决办法:新建一个 m 文件,然后再进行函数的定义5.One or more output arguments not assigned during call to '...'中文解释:在调用...函数过程中,一个或多个输出变量没有被赋值出错原因:函数如果带有输出变量,则每个输出在返回的时候都必须被赋值。
文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。
MATLAB提供了一系列低层输入输出函数,专门用于文件操作。
1、文件的打开与关闭1)打开文件在读写文件之前,必须先用fo pen函数打开或创建文件,并指定对该文件进行的操作方式。
fopen函数的调用格式为:fid=fopen(文件名,…打开方式‟)说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。
文件名用字符串形式,表示待打开的数据文件。
常见的打开方式如下:…r‟:只读方式打开文件(默认的方式),该文件必须已存在。
λ…r+‟:读写方式打开文件,打开后先读后写。
该文件必须已存在。
λ…w‟:打开后写入数据。
该文件已存在则更新;不存在则创建。
λ…w+‟:读写方式打开文件。
先读后写。
该文件已存在则更新;不存在则创建。
λ…a‟:在打开的文件末端添加数据。
文件不存在则创建。
λ…a+‟:打开文件后,先读入数据再添加数据。
文件不存在则创建。
λ另外,在这些字符串后添加一个“t”,如…rt‟或…wt+‟,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fop en函数默认的打开方式。
2)关闭文件文件在进行完读、写等操作后,应及时关闭,以免数据丢失。
关闭文件用f close函数,调用格式为:sta=fclose(fid)说明:该函数关闭f id所表示的文件。
sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。
如果要关闭所有已打开的文件用fc lose(…all‟)。
2、二进制文件的读写操作1)写二进制文件fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。
其调用格式为:COUNT=fwrite(fid,A,precis ion)说明:其中COUN T返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precis ion代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。
附录Matlab源程序附录A 信息熵% 函数说明:%% H=entropy(P,r) 为信息熵函数%% P为信源的概率矢量, r为进制数%% H为信息熵%%****************************** %function H=entropy(P,r)if (length(find(P<=0))~=0)error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,component do not add up to 1');endH=(sum(-P.*log2(P)))/(log2(r)+eps);附录B 离散无记忆信道容量的迭代计算% 信道容量C的迭代算法%% 函数说明:%% [CC,Paa]=ChannelCap(P,k) 为信道容量函数%% 变量说明:%% P:输入的正向转移概率矩阵,k:迭代计算精度%% CC:最佳信道容量,Paa:最佳输入概率矩阵%% Pa:初始输入概率矩阵,Pba:正向转移概率矩阵%% Pb:输出概率矩阵,Pab:反向转移概率矩阵%% C:初始信道容量,r:输入符号数,s:输出符号数%%************************************************** %function [CC,Paa]=ChannelCap(P,k)% 提示错误信息if (length(find(P<0)) ~=0)error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件endif (abs(sum(P')-1)>10e-10)error('Not a prob.vector,component do not add up to 1') % 判断是否符合概率和为1 end% 1)初始化Pa[r,s]=size(P);Pa=(1/(r+eps))*ones(1,r);sumrow=zeros(1,r);Pba=P;% 2)进行迭代计算n=0;C=0;CC=1;while abs(CC-C)>=kn=n+1;% (1)先求PbPb=zeros(1,s);for j=1:sfor i=1:rPb(j)=Pb(j)+Pa(i)*Pba(i,j);endend% (2)再求Pabsuma=zeros(1,s);for j=1:sfor i=1:rPab(j,i)=Pa(i)*Pba(i,j)/(Pb(j)+eps);suma(j)=suma(j)+Pa(i)*Pba(i,j)*log2((Pab(j,i)+eps)/(Pa(i)+eps));end% 3)求信道容量CC=sum(suma);% 4)求下一次Pa,即PaaL=zeros(1,r);sumaa=0;for i=1:rfor j=1:sL(i)=L(i)+Pba(i,j)*log(Pab(j,i)+eps);enda(i)=exp( L(i));endsumaa=sum(a);for i=1:rPaa(i)=a(i)/(sumaa+eps);end% 5)求下一次C,即CCCC=log2(sumaa);Pa=Paa;end% 打印输出结果s0='很好!输入正确,迭代结果如下:';s1='最佳输入概率分布Pa:';s2='信道容量C:';s3='迭代次数n:';s4='输入符号数r:';s5='输出符号数s:';s6='迭代计算精度k:';for i=1:rB{i}=i;enddisp(s0);disp(s1),disp(B),disp(Paa);disp(s4),disp(r);disp(s5),disp(s);disp(s2),disp(CC);disp(s6),disp(k);disp(s3),disp(n);附录C Shannon编码% 函数说明:% % [p,x]=array(P,X) 为按降序排序的函数% % P为信源的概率矢量,X为概率元素的下标矢量% % p为排序后返回的信源的概率矢量% % x为排序后返回的概率元素的下标矢量% %*******************************************% function [p,x]=array(P,X)P=[P;X];[l,n]=size(P);for i=1:nmax=P(1,i);maxN=i;MAX=P(:,i);for j=i:nif (max<P(1,j))MAX=P(:,j);max=P(1,j);maxN=j;endendif (maxN>1)if (i<n)for k=(maxN-1):-1:iP(:, k+1)=P(:,k);endendendP(:,i)=MAX;endp=P(1,:);x=P(2,:);% shannon编码生成器%% 函数说明:%% [W,L,q]=shannon(p) 为shannon编码函数%% p为信源的概率矢量,W为编码返回的码字%% L为编码返回的平均码字长度,q为编码效率%%*****************************************%function [W,L,q]=shannon(p)% 提示错误信息if (length(find(p<=0)) ~=0)error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件endif (abs(sum(p)-1)>10e-10)error('Not a prob.vector,component do not add up to 1') % 判断是否符合概率和为1 end% 1)排序n=length(p);x=1:n;[p,x]=array(p,x);% 2)计算代码组长度ll=ceil(-log2(p));% 3)计算累加概率PP(1)=0;n=length(p);for i=2:nP(i)=P(i-1)+p(i-1);end% 4)求得二进制代码组W% a)将十进制数转为二进制数for i=1:nfor j=1:l(i)temp(i,j)=floor(P(i)*2);P(i)=P(i)*2-temp(i,j);endend% b)给W赋ASCII码值,用于显示二进制代码组Wfor i=1:nfor j=1:l(i)if (temp(i,j)==0)W(i,j)=48;elseW(i,j)=49;endendendL=sum(p.*l); % 计算平均码字长度H=entropy(p,2); % 计算信源熵q=H/L; % 计算编码效率% 打印输出结果for i=1:nB{i}=i;end[n,m]=size(W);TEMP=32*ones(n,6);W=[W,TEMP];W=W';[n,m]=size(W);W=reshape(W,1,n*m);W=sprintf('%s', W);s0='很好!输入正确,编码结果如下:';s1='Shannon 编码所得码字W:';s2='Shannon 编码平均码字长度L:';s3='Shannon 编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);附录D Fano编码% 函数说明:% % [next_P,next_index,code_num]=compare(current_P,current_index) % % 为比较函数,主要用于信源符号的分组% % current_P为当前分组的信源的概率矢量%% current_index为当前分组的信源的下标%% next_P为返回的下次分组的信源的概率矢量 %% next_index为返回的下次分组的信源的下标%% code_num为返回的ASCII值 %%*********************************************************************% function [next_P,code_num,next_index]=compare(current_P,current_index);n=length(current_P);add(1)=current_P(1);% 1)求概率的依次累加和for i=2:nadd(i)=0;add(i)=add(i-1)+current_P(i);end% 2)求概率和最接近的两小组s=add(n);for i=1:ntemp(i)=abs(s-2*add(i));end[c,k]=min(temp);% 3)对分组的信源赋ASCII值if (current_index<=k)next_index=current_index;code_num=48;next_P=current_P(1:k);elsenext_index=current_index-k;code_num=49;next_P=current_P((k+1):n);end% fano编码生成器%% 函数说明:%% [W,L,q]=fano(P) 为fano编码函数%% P为信源的概率矢量,W为编码返回的码字%% L为编码返回的平均码字长度,q为编码效率%%*****************************************%function [W,L,q]=fano(P)% 提示错误信息if (length(find(P<=0)) ~=0)error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,component do not add up to 1') % 判断是否符合概率和为1 end% 1)排序n=length(P);x=1:n;[P,x]=array(P,x);% 2)将信源符号分组并得到对应的码字for i=1:ncurrent_index=i;j=1;current_P=P;while 1[next_P,code_num,next_index]=compare(current_P,current_index);current_index=next_index;current_P=next_P;W(i,j)=code_num;j=j+1;if (length(current_P)==1)break;endendl(i)=length(find(abs(W(i,:)) ~=0)); % 得到各码字的长度endL=sum(P.*l); % 计算平均码字长度H=entropy(P,2); % 计算信源熵q=H/L; % 计算编码效率% 打印输出结果for i=1:nB{i}=i;end[n,m]=size(W);TEMP=32*ones(n,5);W=[W,TEMP];W=W';[n,m]=size(W);W=reshape(W,1,n*m);W=sprintf('%s', W);s0='很好!输入正确,编码结果如下:';s1='Fano 编码所得码字W:';s2='Fano 编码平均码字长度L:';s3='Fano 编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);附录E Huffman编码Huffman编码(1)% huffman编码生成器%% 函数说明:%% [W,L,q]=huffman(P) 为huffman编码函数%% P为信源的概率矢量,W为编码返回的码字%% L为编码返回的平均码字长度,q为编码效率%%*****************************************%function [W,L,q]=huffman(P)if (length(find(P<=0)) ~=0)error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件endif (abs(sum(P)-1)>10e-10)error('Not a prob.vector,component do not add up to 1') % 判断是否符合概率和为1 endn=length(P); % 计算输入元素个数p=P;mark=zeros(n-1,n); % mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序% 1) 确定概率大小值的排列,得到mark矩阵。
一、简介MATLAB是一种高级的技术计算语言和交互式环境,广泛用于工程和科学计算。
在MATLAB中,endfunction函数是用来结束一个函数定义的关键字。
本文将详细介绍MATLAB中endfunction函数的用法及其作用。
二、endfunction函数的用法1. 在MATLAB中定义函数时,需要使用关键字function来声明函数开始,并在函数体结束处使用end关键字来结束函数定义。
具体语法格式如下:```MATLABfunction [output1,output2,…] = myfunction(input1,input2,…)函数体end```2. 在函数定义中,end关键字的作用是告诉MATLAB解释器函数定义的结束位置,以便正确解析函数体的内容。
3. 在MATLAB中,end关键字的使用非常灵活,可以用来结束循环、条件语句,也可以用来结束函数的定义。
三、endfunction函数的作用1. 结束函数定义:endfunction函数的主要作用是结束函数的定义,使得MATLAB解释器知道函数体的范围,方便进行函数的解析和执行。
2. 提高代码可读性:使用endfunction函数可以使函数定义的开始和结束位置更加清晰明了,提高了代码的可读性和可维护性。
四、endfunction函数的注意事项1. 在MATLAB中,函数定义的开始和结束必须严格对应,否则会导致语法错误。
在编写函数时要注意嵌套的开始和结束位置,确保匹配。
2. 在使用多层嵌套的函数定义时,建议使用合适的缩进和注释,以提高代码的可读性。
五、示例代码以下是一个简单的MATLAB函数定义示例,用来计算两个数的和:```MATLABfunction result = mysum(a, b)计算两个数的和result = a + b;end```六、总结本文介绍了MATLAB中endfunction函数的用法和作用,该函数是用来结束函数定义的关键字,能够提高代码的可读性和可维护性。
Matlab文件操作及读txt文件(fopen,fseek,fread,fclose) matlab文件操作文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。
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等。
- 1 -
matlab复制文件函数
Matlab有许多处理文件的函数,其中之一是复制文件函数。复
制文件函数可以将一个文件复制到另一个文件夹中。下面是Matlab
中复制文件函数的基本用法:
% 源文件路径
sourceFile = 'C:UserstestDocumentssource.txt';
% 目标文件路径
targetFile = 'C:UserstestDocumentsdestination.txt';
% 调用Matlab复制文件函数
copyfile(sourceFile, targetFile);
在这个例子中,我们将源文件(source.txt)复制到目标文件
(destination.txt)中。在使用复制文件函数时,我们需要指定源文
件的路径和目标文件的路径。我们可以使用绝对路径或相对路径来指
定文件路径。
另外,我们还可以使用更多的选项来控制复制过程。例如,我们
可以使用'f'选项来覆盖目标文件,使用'v'选项来显示复制过程的详
细信息等。有关更多选项的信息,请参阅Matlab的文档。
总的来说,复制文件函数是Matlab中非常有用的文件处理函数
之一。它可以帮助我们快速地复制文件,使我们的工作更加高效和方
便。
matlab 关机代码以下是关于MATLAB关机代码的续写,内容包括关机代码的原理、常用方法以及注意事项。
一、关机代码原理MATLAB关机代码的实现主要是通过调用MATLAB内部的命令来完成。
在MATLAB中,有一个名为“system”的函数,可以用来执行操作系统命令。
通过调用这个函数,我们可以实现关机操作。
此外,还可以使用“exit”命令直接退出MATLAB程序。
二、常用关机方法1. 使用system命令关机```matlabsystem('shutdown -s -t0')```这条代码会立即关闭计算机,并在关机过程中不会弹出任何提示。
其中,“-s”表示关闭计算机,“-t0”表示立即关机。
2. 使用exit命令关机```matlabexit```这条代码会直接退出MATLAB程序,并在后台执行关机操作。
需要注意的是,这种方法关机时,MATLAB不会对正在运行的程序进行保存。
3. 使用命令窗口关机在MATLAB命令窗口中输入以下命令:```matlabcommand_name -s -t0```其中,`command_name`表示关机命令,如`shutdown`或`poweroff`。
此方法与在MATLAB脚本中使用system命令关机相同。
三、注意事项1.确保在关机前保存所有需要保存的工作,以免丢失数据。
2.如果是协同工作环境,请确保通知其他使用者以免影响他们的操作。
3.为了避免关机过程中出现错误,建议在脚本中添加错误处理机制。
4. 如果需要在关机前进行某些特定操作,可以使用`disp`命令显示提示信息,以确保用户了解当前状态。
通过以上介绍,相信大家对MATLAB关机代码有了更深入的了解。
在实际应用中,可以根据需求选择合适的关机方法,确保程序的正常运行。
www.pudn.com > mssa.rar > EEOF.M function [E,V,A,C]=eeof(X, M, convert) % Syntax: [E,V,A,C]=eeof(X, M); [E,V,A,C]=eeof(X, M, 1); % This function performs an extended empirical orthogonal % function (EEOF) analysis of matrix 'X', for embedding dimension 'M'. % Each of the L columns of X is a time series of length N. % % Returns: E - eigenfunction matrix. (LM by LM) % V - vector containing variances (unnormalized eigenvalues). % A - matrix of principal components. % C - lag-covariance matrix. % % V is ordered from large to small: E and A are sorted accordingly. % % Note that X is assumed to be centered. To center the data, use % the commands: % [r,c]=size(X); X=X-ones(r,1)*mean(X); before running EEOF. % If you also want to standardize the data, use: % X=X./(ones(r,1)*std(X));. % % If a third argument is supplied, the eigenfunctions/values will % be reordered into the same format as MSSA output - i. e. L blocks % of size M rather than M blocks of size L. % % This function provides the same output, within numerically determined % limits, as MSSA methods using Broomhead-King type covariance estimation: % it is intended as a check on those functions. % % Note that this function is *extremely* computationally intensive % for large matrices and lags. For example, if X is 1000 by 1000, % and M = 5, EEOF will take about 10 hours on a Cray YMP! Inputting % a subset of the PCs of X rather than the full data matrix can % substantially reduce the computational load. % % Written by Eric Breitenberger. Version date 1/11/96 %************************************************.edu%
[N,L]=size(X); if M*L>=N-M+1, disp('Warning: Covariance matrix may be ill-conditioned.'), end
% Create the extended matrix: T=zeros(N-M+1,M*L); for i=1:M T(:,L*(i-1)+1:L*i)=X(i:N-M+i,:); end
% Compute the eigenvectors/values of the covariance matrix: C=(T'*T)/(N-M+1); clear X [E,V]=eig(C); V=diag(V);
A=T*E; % compute principal components
if nargin==3 % Prepare MSSA-style output: % sort E,V,C, and A from M blocks of L to L blocks of M. ind=1:L:(M-1)*L+1; for i=1:L, index=[index ind+i-1]; end E=E(index,index); V=V(index); % sort the covariance matrix and PCs: C=C(index,index); A=A(:,index); end
% Sort eigenvalues/vectors/PCs in descending order: [V,ind]=sort(-V); V=-V'; E=E(:,ind); A=A(:,ind);
www.pudn.com > mssa.rar > EOF.M function [F,L,B]=eof(X,n,s);
% EOF calculates the empirical orthogonal functions % and amplitudes (principal components) of the data matrix 'X'. % Syntax: [F,L,B]=eof(X); [F,L,B]=eof(X,.9,'norm'); % % Input: X - data matrix. For a standard (S-mode) EOF analysis, % the columns of X are time series, while the rows % are spatial maps. The eigenfunctions in this case % will be spatial patterns, and the principal % components are time series. % n - number of eigenfunctions to return (optional). % If n is less than 1, it is interpreted as % a fractional variance (e. g. n=.9), and enough % eigenvectors are returned to account for n*100% % of the variance. The default is to return all EOFs. % s - Normalization option. If s='norm', then each % column of X will be normalized (assigned % unit variance). If s is not specified, the % data are not normalized. % % Output: F - eigenfunction matrix (columns are eigenvectors). % L - vector of eigenvalues.(all eigenvalues are returned) % B - principal components matrix. % % Written by Eric Breitenberger. Version date 1/11/96 %************************************************.edu% [r,c]=size(X); if c>r, disp('Warning: Covariance matrix may be ill-conditioned.'), end if nargin==1 n=c; s='none'; elseif nargin==2 if isstr(n) s=n; n=c; else s='none'; end end
X=X-ones(r,1)*mean(X); % center the data if s=='norm' X=X./(ones(r,1)*std(X)); % normalize elseif s~='none' error('Improper normalization option. Please check inputs.') end
S=X'*X; % compute the covariance matrix [F,L]=eig(S); clear S
% sort eigenvectors, eigenvalues [L,i]=sort(diag(-L)); L=-L'; F=F(:,i);
% figure out how many eigenvectors to keep: if n<1 % if n is in the form of fractional variance, convert to an index var=n*sum(L); i=find(cumsum(L)>=var); n=i(1); end
if c>n, F=F(:,1:n); end % keep only first n eigenvectors B=X*F; % calculate principal components (first n)
www.pudn.com > mssa.rar > EOFCENT.M function [F,L,B]=eofcent(X,n); % EOF calculates the empirical orthogonal functions % and amplitudes (principal components) of the data matrix 'X'. % Syntax: [F,L,B]=eof(X); [F,L,B]=eof(X,.9); % % Input: X - data matrix. For a standard (S-mode) EOF analysis, % the columns of X are time series, while the rows % are spatial maps. The eigenfunctions in this case % will be spatial patterns, and the principal % components are time series. % n - number of eigenfunctions to return (optional). % If n is less than 1, it is interpreted as % a fractional variance (e. g. n=.9), and enough % eigenvectors are returned to account for n*100% % of the variance. The default is to return all EOFs. % % Output: F - eigenfunction matrix (columns are eigenvectors). % L - vector of eigenvalues.(all eigenvalues are returned)