Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2008-03-30, 13:48   #1
闫世军 neu
初级会员
 
注册日期: 2008-03-27
年龄: 40
帖子: 11
声望力: 18
闫世军 neu 正向着好的方向发展
帖子 [求助]??? Index exceeds matrix dimensions.

%输入n个蛋白质二级结构序列,我们首先用2D图形表示方法得到n个蛋白质的M-曲线,从
%曲线中我们提取一些结构特征,同时考虑原有序列的一些结构特征,得到这n个蛋白质的
%结构特征向量CV,在利用欧几里德度量公式得到一个n*n距离矩阵D
clear;
clc;
n=input('the number of the proteins:'); % 输入蛋白质的个数
%输入每个蛋白质二级结构序列SSS(Secondary Structure Sequence)
for i=1:n
fprintf('the sequence %d:\n',i);
SSS{1,i}=input(' ','s');
end
%输入每个蛋白质二级结构序列的名称NAME
for i=1:n
fprintf('the name of the protein %d:\n',i);
NAME{1,i}=input(' ','s');
end
%构造横坐标X的元胞数组X{1,n},纵坐标Y的元胞数Y{1,n}
for i=1:n
m=length(SSS{1,i});
X{1,i}=zeros(1,m+1);Y{1,i}=zeros(1,m+1);
end
%构造蛋白质二级结构序列中H和E的个数向量nH和nE,并给它们赋初值
nH=zeros(1,n);nE=zeros(1,n);
%构造蛋白质二级结构序列对应的类三角形总数n3和类梯形总数n4,以及它们的总数N,并给它们赋初值
n3=zeros(1,n);n4=zeros(1,n);N=zeros(1,n);
%构造蛋白质二级结构的特征向量CV(Characteristic Vector)的元胞数组CV{1,n},并给其赋初值
for i=1:n
CV{1,i}=zeros(1,4);
end
%构造一个n*n的距离矩阵D,并给其赋初值
D=zeros(n,n);
%每个蛋白质二级结构序列中H和E的含量 cH,cE
for i=1:n
m=length(SSS{1,i});
for j=1:m
if SSS{1,i}(j)=='H'
nH(i)=nH(i)+1;
elseif SSS{1,i}(j)=='E'
nE(i)=nE(i)+1;
end
end
cH(i)=nH(i)/m;
cE(i)=nE(i)/m;
end
%用2D图形表示方法得到n个蛋白质二级结构序列的n条M-曲线
for i=1:n
m=length(SSS{1,i});
for j=2m+1)
X{1,i}(j)=j-1;
if SSS{1,i}(j-1)=='H'
Y{1,i}(j)=Y{1,i}(j-1)+1;
elseif SSS{1,i}(j-1)=='E'
Y{1,i}(j)=Y{1,i}(j-1)-1;
else Y{1,i}(j)=Y{1,i}(j-1);
end
end
figure(i)
plot(X{1,i},Y{1,i},'m');
title(NAME{1,i});
end
%计算每个蛋白质二级结构序列对应的所有类三角形和类梯形总数
for i=1:n
m=length(SSS{1,i});
j=1;
while j<m
if Y{1,i}(j+1)==Y{1,i}(j)
for k=1m-1-j)
if Y{1,i}(j+k+1)==Y{1,i}(j+k)
continue;
else break;
end
end
j=j+k;
elseif Y{1,i}(j+1)>Y{1,i}(j)
for s=1m-j-1)
if Y{1,i}(j+s+1)>Y{1,i}(j+s)
continue;
else break;
end
end
j=j+s;
if Y{1,i}(j+1)==Y{1,i}(j)
for t=1m-j-1)
if Y{1,i}(j+t+1)==Y{1,i}(j+t)
continue;
elseif Y{1,i}(j+t+1)>Y{1,i}(j+t)
break;
else
n4(i)=n4(i)+1;break;
end
j=j+t;
end
elseif Y{1,i}(j+1)<Y{1,i}(j)
n3(i)=n3(i)+1;
end
else
for p=1m-j-1)
if Y{1,i}(j+p+1)<Y{1,i}(j+p)
continue;
else break;
end
end
j=j+p;
if Y{1,i}(j+1)==Y{1,i}(j)
for q=1m-j-1)
if Y{1,i}(j+q+1)==Y{1,i}(j+q)
continue;
elseif Y{1,i}(j+q+1)<Y{1,i}(j+q)
break;
else
n4(i)=n4(i)+1;break;
end
j=j+q;
end
elseif Y{1,i}(j+1)>Y{1,i}(j)
n3(i)=n3(i)+1;
end
end
end
N(i)=n3(i)+n4(i);
end
%计算每个蛋白质二级结构序列被H分割的E个数分布的向量pE,它们构成了一个元胞数组pE{1,n}
%同时计算每个蛋白质二级结构序列被E分割的H个数分布的向量pH,它们构成了一个元胞数组pH{1,n}
for i=1:n
m=length(SSS{1,i});
%计算每个蛋白质二级结构序列被H分割的E个数分布的向量pE,它们构成了一个元胞数组pE{1,n}
for j=1:m
if SSS{1,i}(j)=='E'
k=j;break;
end
end
s=1;pE{1,i}(s)=0;
while k<=m
if SSS{1,i}(k)=='C'
k=k+1;
elseif SSS{1,i}(k)=='E'
pE{1,i}(s)=pE{1,i}(s)+1;k=k+1;
else
for n=1m-k)
if (SSS{1,i}(k+n)=='H')|(SSS{1,i}(k+n)=='C')
continue;
else break;
end
end
k=k+n; s=s+1;pE{1,i}(s)=0;
end
end
if pE{1,i}(s)==0
pE{1,i}(s)=[ ];
end
%同时计算每个蛋白质二级结构序列被E分割的H个数分布的向量pH,它们构成了一个元胞数组pH{1,n}
for j=1:m
if SSS{1,i}(j)=='H'
k=j;break;
end
end
s=1;pH{1,i}(s)=0;
while k<=m
if SSS{1,i}(k)=='C'
k=k+1;
elseif SSS{1,i}(k)=='H'
pH{1,i}(s)=pH{1,i}(s)+1;k=k+1;
else
for n=1m-k)
if (SSS{1,i}(k+n)=='E')|(SSS{1,i}(k+n)=='C')
continue;
else break;
end
end
k=k+n; s=s+1;pH{1,i}(s)=0;
end
end
if pH{1,i}(s)==0
pH{1,i}(s)=[ ];
end
end
%得到每个蛋白质二级结构序列对应的特征向量 CV(Characteristic Vector)
for i=1:n
if cE(i)<1/20----------------------------------------------------------------------------------------179行
CV{1,i}(1)=cE(i);
else CV{1,i}(1)=-1;
end
if cH(i)<1/20
CV{1,i}(2)=cH(i);
else CV{1,i}(2)=0;
end
CV{1,i}(3)=5*N(i)/length(SSS{1,i});
if length(pH{1,i})==0
CV{1,i}(4)=sqrt(sum((pE{1,i}-mean(pE{1,i})*ones(1, length(pE{1,i}))).^2)/ length(pE{1,i}));
elseif length(pE{1,i})==0
CV{1,i}(4)=sqrt(sum((pH{1,i}-mean(pH{1,i})*ones(1,length(pH{1,i}))).^2)/length(pH{1,i}));
else
CV{1,i}(4)=max(sqrt(sum((pH{1,i}-mean(pH{1,i})*ones(1,length(pH{1,i}))).^2)/length(pH{1,i})),sqrt(sum((pE{1,i}-mean(pE{1,i})*ones(1, length(pE{1,i}))).^2)/ length(pE{1,i})));
end
end
%得到 n个蛋白质二级结构序列之间的距离矩阵D(n*n)
for i=1:n
for j=1:n
D(i,j)=sqrt(sum((CV{1,i}-CV{1,j}).^2))%利用了欧几里德距离公式
end
end

出现了如下错误,不知如何修改,请高手指教,多谢!!!

??? Index exceeds matrix dimensions.

Error in ==> graphmatrix at 179
if cE(i)<1/20
上传的附件
文件类型: doc sequence.doc (37.0 KB, 2 次查看)
闫世军 neu 当前离线   回复时引用此帖
旧 2008-03-30, 13:58   #2
dnping
高级会员
 
注册日期: 2007-07-26
年龄: 40
帖子: 268
声望力: 24
dnping 是一个将要出名的人
默认

你的下标,即cE里面的元素索引超出了cE向量的长度,请楼主仔细检查下程序。
cE的向量里面没有n个元素。
第179行那里。
dnping 当前离线   回复时引用此帖
旧 2008-03-30, 14:06   #3
闫世军 neu
初级会员
 
注册日期: 2008-03-27
年龄: 40
帖子: 11
声望力: 18
闫世军 neu 正向着好的方向发展
默认

%每个蛋白质二级结构序列中H和E的含量 cH,cE
for i=1:n
m=length(SSS{1,i});
for j=1:m
if SSS{1,i}(j)=='H'
nH(i)=nH(i)+1;
elseif SSS{1,i}(j)=='E'
nE(i)=nE(i)+1;
end
end
cH(i)=nH(i)/m;
cE(i)=nE(i)/m;-----------------这里
end

但是你看这一部分程序,cE中还有n 个元素呀
闫世军 neu 当前离线   回复时引用此帖
旧 2008-03-30, 14:22   #4
dnping
高级会员
 
注册日期: 2007-07-26
年龄: 40
帖子: 268
声望力: 24
dnping 是一个将要出名的人
默认

for n=1m-k)
if (SSS{1,i}(k+n)=='H')|(SSS{1,i}(k+n)=='C')
continue;
else break;
end
end

for n=1m-k)
if (SSS{1,i}(k+n)=='E')|(SSS{1,i}(k+n)=='C')
continue;
else break;
end
end

我想你的n应该是索引吧?但是你在上面标红的地方却作为循环的变量,有点混乱了吧?n已经不是原来的n了。
dnping 当前离线   回复时引用此帖
旧 2008-03-30, 14:30   #5
闫世军 neu
初级会员
 
注册日期: 2008-03-27
年龄: 40
帖子: 11
声望力: 18
闫世军 neu 正向着好的方向发展
默认

有可能,我在试试看,谢谢你。
闫世军 neu 当前离线   回复时引用此帖
旧 2008-03-30, 14:36   #6
闫世军 neu
初级会员
 
注册日期: 2008-03-27
年龄: 40
帖子: 11
声望力: 18
闫世军 neu 正向着好的方向发展
默认

行了,谢谢你,真是感谢你呀,字母确实有点混乱。
闫世军 neu 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


相似的主题
主题 主题作者 版面 回复 最后发表
matlab解一个复杂的方程组 danrushui MATLAB论坛 2 2008-04-13 22:22


所有时间均为北京时间。现在的时间是 06:51


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.