PDA

查看完整版本 : 向量为什么会有未定义的问题??


gkyingkyin
2008-06-05, 17:36
我编的程序,最后用到向量r,按说向量应该不用定义吧,可是不知为什么,一运行就显示

??? Undefined function or variable 'r'.

Error in ==> fengle at 248
r

请高人解答,谢谢!!急!!
以下是我的程序:

I=imread('ggg.bmp');
J1=I;
J2=I;
J3=I;
M1=rgb2gray(J1);
N1=histeq(M1);
for i=200:400
if N1(i,1)<50
Q=i;
end;
end;
I=double(I);
for i=1:480
for j=1:640
IR=I(i,j,1)/255;
IG=I(i,j,2)/255;
IB=I(i,j,3)/255;
k=0.21267/[0.21267*IR+0.71516*IG+0.07217*IB];
R=IR*k;
G=IG*k;
B=IB*k;
x=0.41245*R+0.35758*G+0.18042*B;
y=0.21267*R+0.71516*G+0.07217*B;
z=0.01933*R+0.11919*G+0.95023*B;
a=500*[myfun(x/0.95045)-myfun(y)];
b=200*[myfun(y)-myfun(z/1.08875)];
L=myfun(y)*116-16;
if (I(i,j,1)-I(i,j,3)>25)&(I(i,j,1)-I(i,j,2)>25)&(b/a>0)&(b/a<1/2)&(a^2+b^2>25)&i<Q
J1(i,j,1)=255;
J1(i,j,2)=0;
J1(i,j,3)=0;
end;
end;
end;
for i=1:480
for j=1:640
if (I(i,j,1)-I(i,j,3)>25)&(I(i,j,1)-I(i,j,2)>25)
J2(i,j,1)=255;
J2(i,j,2)=255;
J2(i,j,3)=255;
end;
end;
end;
M2=rgb2gray(J2);
P=rgb2gray(J3);
N2=histeq(M2);
for i=200:400
if N2(i,1)<50
Q=i;
end;
end;
c=0;
A=0;
B=0;
for i=Q-50:Q-10
for j=2:630
if N2(i,j)<90&(N2(i-2,j)-N2(i,j)>35)&(N2(i+2,j)-N2(i,j)>35)
c=c+1;
A=A+j;
B=B+i;
end;
end;
end;
C=A/c;
D=B/c;
E=0;
F=0;
for i=Q-50:Q-10
for j=2:630
if N2(i,j)<90&(N2(i-2,j)-N2(i,j)>35)&(N2(i+2,j)-N2(i,j)>35)
E=E+(j-C)*(i-D);
F=F+(j-C)^2;
end;
end;
end;
G=E/F;
H=D-G*C;
for i=Q-50:Q-10
for j=2:630
if abs(G*j-i+H)/((G^2+1)^(1/2))<=0.5
J1(i,j,1)=255;
J1(i,j,2)=255;
J1(i,j,3)=255;
N2(i,j)=255;
P(i,j)=255;
end;
end;
end;%得到最底下的边框
for i=1:400
if N2(i,2)==255;
R=i;
end;
end;
c=0;
A=0;
B=0;
for i=R-160:R-120
for j=2:630
if N2(i,j)<90&(N2(i-2,j)-N2(i,j)>35)&(N2(i+2,j)-N2(i,j)>35)
c=c+1;
A=A+j;
B=B+i;
end;
end;
end;
C=A/c;
D=B/c;
E=0;
F=0;
for i=R-160:R-120
for j=2:640
if N2(i,j)<90&(N2(i-2,j)-N2(i,j)>35)&(N2(i+2,j)-N2(i,j)>35)
E=E+(j-C)*(i-D);
F=F+(j-C)^2;
end;
end;
end;
G=E/F;
H=D-G*C;
for i=R-160:R-120
for j=2:630
if abs(G*j-i+H)/((G^2+1)^(1/2))<=0.5
J1(i,j,1)=255;
J1(i,j,2)=255;
J1(i,j,3)=255;
N2(i,j)=255;
P(i,j)=255;
end;
end;
end;%得到最上面的边
for i=1:200
if N2(i,2)==255
S=i;
end;
end;
T=(R+S)/2;
T=fix(T);
for j=1:640
J1(T,j,1)=255;
J1(T,j,2)=255;
J1(T,j,3)=255;
N2(T,j)=255;
P(T,j)=255;
end;%得到中间的边
c=0;
A=0;
B=0;
for i=1:480
for j=1:640
if (I(i,j,1)-I(i,j,3)>25)&(I(i,j,1)-I(i,j,2)>25)
c=c+1;
A=A+j;
B=B+i;
end;
end;
end;
C=A/c;
D=B/c;
E=0;
F=0;
for i=1:480
for j=1:640
if (I(i,j,1)-I(i,j,3)>25)&(I(i,j,1)-I(i,j,2)>25)
E=E+(j-C)*(i-D);
F=F+(j-C)^2;
end;
end;
end;
G=E/F;
H=D-G*C;
for i=1:480
for j=10:630
if abs(G*j-i+H)/((G^2+1)^(1/2))<=0.5
if M2(i-25,j-2)-M2(i-25,j)>30&M2(i-25,j+2)-M2(i-25,j)>30&M2(i-25,j)<200&M2(i-26,j)<200&M2(i-24,j)<200&M2(i-25,j-1)<200&M2(i-25,j+1)<200&M2(i-26,j-1)<200&M2(i-26,j+1)<200&M2(i-24,j-1)<200&M2(i-24,j+1)<200
for k=i-200:i+50
J1(k,j,1)=255;
J1(k,j,2)=255;
J1(k,j,3)=255;
N2(k,j)=255;
P(k,j)=255;
end;
end;
end;
end;
end;%得到拟合的红线,与边框竖线的交叉点并上下延长
T=P;
h=1;
for i=1:Q
for j=10:630
if P(i,j)==255&P(i,j-1)==255&P(i,j+1)==255
p(h)=i;
h=h+1;
end;
end;
end;
U=min(p);
V=max(p);
for i=1:480
for j=1:640
if i<U|i>V
P(i,j)=0;
J1(i,j,1)=0;
J1(i,j,2)=0;
J1(i,j,3)=0;
end;
end;
end;
h=1;
for i=5:Q
for j=1:640
if T(i,j)==255&T(i-1,j)==255&T(i+1,j)==255
q(h)=j;
h=h+1;
end;
end;
end;
X=min(q);
Y=max(q);
for i=1:480
for j=1:640
if j<X|j>Y
P(i,j)=0;
J1(i,j,1)=0;
J1(i,j,2)=0;
J1(i,j,3)=0;
end;
end;
end;
for i=1:480
for j=1:640
if J1(i,j,1)==255|(J1(i,j,1)==0&J1(i,j,2)==0&J1(i,j,2)==0)
else J1(i,j,1)=0;
J1(i,j,2)=0;
J1(i,j,3)=0;
end;
end;
end;
imwrite(J1,'vv.bmp');%得到只包含分数栏和分数的图片
k=(T+S)/2;
k=fix(k);
h=1;
for j=1:640
if J1(k,j,1)==255&J1(k,j,2)==255&J1(k,j,3)==255&J1(k,j+1,1)==0&J1(k,j+1,2)==0&J1(k,j+1,3)==0
r(h)=j;
h=h+1;
end;
end;
r

watcher
2008-06-06, 15:07
先说几句题外话,LZ的程序是标准的C语言式的编程方法,这样的程序在Matlab中运行的效率比较低。
再回答LZ的问题,你的程序很长,错误在248行,我没细数,应该是最后一行了。在最后一行,LZ是想显示r的内容。我们知道,Matlab中使用变量无需事先定义,但是如果要显示变量值的话,必须要求先对变量赋值。另一点要注意的是,Matlab是解释性语言,只有流程经过的代码才会被解释和执行。我估计程序报错的原因是,由于if语句的条件不合理,上面几行对r的赋值操作在程序运行过程中始终没有被执行过。

fanxing39
2008-06-09, 22:18
matlab里大小写 是不用的变量 比如 a 和 A,你的这个里有R 和r 是不是这里弄错了!



ps: 读进来的是矩阵,没有用matlab 里的相关命令,而是自己再编程,一行行,一列列的 找,或者替换,程序有写麻烦了
find() 可以直接在矩阵里寻找 到满足括号内部条件的 矩阵的位置!