数学建模社区-数学中国

标题: matlab程序出错,求高手指点 [打印本页]

作者: 笑傲天方    时间: 2011-8-20 22:08
标题: matlab程序出错,求高手指点
本帖最后由 笑傲天方 于 2011-8-20 22:18 编辑

这是2007年数模B题:乘公交看奥运的第一题程序,利用图论思想和扩散路由算法编的程序,但matlab运行结果有错
总是:??? Function 'eq' is not defined for values of class 'cell'.

Error in ==> eq at 18
  [varargout{1:nargout}] = builtin('eq', varargin{:});

Error in ==> vv at 62
                [row2 col2]=find(d==Fj(k,2));

源程序代码如下:求高人指点

function vv(start,aim)
%d=importdata('d:\matlab.mat');
[fee d]=data();
if numel(find(d==start))==0
    fprintf('The path cannot be found!');      
else
    [row col]=find(d==start);
    for i=1:numel(row)
        [rows cols(i,1:2)]=find(d(row(i),: )==start);
    end
    F=creatF(start,row,cols,d);
end
if ismember(aim,F( :,2))
    num=find(F(:,2)==aim);
    line=round(F(num,3)-0.5);
    long=F(num,1)-1;
    time=3*F(num,1);
    value=val(0,F(num,: ),fee);
    updown=ud(F(num,3));
    n={start,updown,line,aim,long,time,value};
    print(n);
else
    size_F=size(F);
    cha=1;
    Fc={};
    n={};
    for i=1:size_F(1)
        [row1 col1]=find(d==F(i,2));
        [rows cols]=find(d==start);
        row1=setdiff(row1,rows);
        if numel(row1)>0
            for j=1:numel(row1)
                col1(j,1:2)=find(d(row1(j),: )==F(i,2));
            end
            F1=creatF(F(i,2),row1,col1,d);
            Fc={Fc F1};
            if ismember(aim,F1( :,2))
                num1=find(F1( :,2)==aim);
                line1=round(F(i,3)-0.5);
                mid1=F(i,2);
                long1=F(i,1)-1;
                line2=round(F1(num1,3)-0.5);
                long2=F1(num1,1)-1;
                time=3*(F(i,1)+F1(num1,1))+5;
                value=val(0,F(i,: ),fee);
                value=val(value,F1(num1,: ),fee);
                updown1=ud(F(i,3));
                updown2=ud(F1(num1,3));
                n(cha,: )={start,updown1,line1,mid1,long1,updown2,line2,aim,long2,time,value};
                cha=cha+1;
            end
        end
    end
    if cha==1
        fprintf('The path with once chang cannot be found!\n');
        sizec=size(Fc);
        kind=1;
        for j=1:sizec(2)
            siz=size(Fc{j});
            Fj=Fc{j};
            for k=1:siz(1)
                [row2 col2]=find(d==Fj(k,2));
                [rows cols]=find(d==Fj(1,2));
                [row col]=find(d==start);
                row2=setdiff(row2,rows);
                row2=setdiff(row2,row);
                if numel(row2)>0
                    for l=1:numel(row2)
                        col2(l,1:2)=find(d(row2(l),: )==Fj(k,2));
                    end
                    F2=creatF(Fj(k,2),row2,col2,d);
                    if ismember(aim,F2( :,2))
                        num2=find(F2( :,2)==aim);
                        num1=find(Fj( :,2)==F2(1,2));
                        num=find(F( :,2)==Fj(1,2));
                        line1=round(F(num,3)-0.5);
                        line2=round(Fj(num1,3)-0.5);
                        line3=round(F2(num2,3)-0.5);
                        mid1=F(num,2);
                        mid2=Fj(num1,2);
                        long1=F(num,1)-1;
                        long2=Fj(num1,1)-1;
                        long3=F2(num2,1)-1;
                        time=3*(long1+long2+long3+3)+10;
                        value=val(0,F(num,: ),fee);
                        value=val(value,Fj(num1,: ),fee);
                        value=val(value,F2(num2,: ),fee);
                        updown1=ud(F(num,3));
                        updown2=ud(Fj(num1,3));
                        updown3=ud(F2(num2,3));
                        n(kind,: )={start,updown1,line1,mid1,long1,updown2,line2,mid2,long2,updown3,line3,aim,long3,time,value};
                        kind=kind+1;                        
                    end
                end
            end
        end
        if kind==1
            fprintf('The path with twice change cannot be found!\n');;
        else
            minn=n{1,14};
            for i=1:kind-1
                if n{i,14}<minn
                    minn=n{i,14};
                end
            end
            for i=1:kind-1
                if n{i,14}==minn
                    print(n(i,: ));
                end
            end
        end
    else
        minn=n{1,10};
        for i=1:cha-1
            if n{i,10}<minn
                minn=n{i,10};
            end
        end
        for i=1:cha-1
            if n{i,10}==minn
                print(n(i,: ));
            end
        end
    end
end
return
function F=creatF(start,rows,cols,d)
%d=importdata('d:\我的文档\桌面\matlab.mat');
F=[0 start 0];
n=numel(rows);
for j=1:n
    maxcol=numel(nonzeros(d(rows(j),: )));
    if cols(j,1)~=cols(j,2)
        for i=cols(j,1)+1:cols(j,2)-1
            x=[i-cols(j,1) d(rows(j),i) rows(j)/2+0.5];
            F=[F;x];
        end        
        for i=1:cols(j,1)-1
            x=[maxcol-cols(j,2)+i d(rows(j),i) rows(j)/2+0.5];
            F=[F;x];
        end
        for i=cols(j,2)+1:maxcol
            x=[i-cols(j,2) d(rows(j),i) rows(j)/2+0.5];
            F=[F;x];
        end        
    else
        for k=cols(j)+1:maxcol
            x=[k-cols(j) d(rows(j),k) rows(j)/2+0.5];
            F=[F;x];
        end
    end
end
size_F=size(F);
f=unique(F( :,2));
size_f=size(f);
j=0;
re=0;
for i=1:size_F(1)
    if ismember(F(i,2),f)
        f(find(f==F(i,2)))=[];
    else
        if ~ismember(F(i,2),re)
            j=j+1;
            re(j)=F(i,2);
        end
    end
end
others=[];
for k=1:j
    [row col]=find(F( :,2)==re(k));
    [minre,where]=min(F(row,1));
    where=row(where);
    other=setdiff(row',where);
    others=[others other];
end
F(others,: )=[];
return
function value=val(vl,F,fee)
%fee=importdata('d:\我的文档\桌面\fee.mat');
if strcmp(fee{round(F(3)-0.5)},'单一票制1元。')|F(1)<=20
    value=vl+1;
else
    if F(1)>20&F(1)<=40
        value=vl+2;
    else
        value=vl+3;
    end
end
return
function updown=ud(F)
if round(F)==F
    updown='上';
else
    updown='下';
end
return
function print(n)
if numel(n)==7
    fprintf('您可以从%d站乘坐%s行%d路公汽直到%d站,中途经过%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!',n{1},n{2},n{3},n{4},n{5},n{6},n{7});
end
if numel(n)==11
    fprintf('您可以从%d站乘坐%s行%d路公汽到%d站,中途经过%d个车站,从此站转乘%s行%d路公汽直到%d站,中途经过%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!\n',n{1},n{2},n{3},n{4},n{5},n{6},n{7},n{8},n{9},n{10},n{11});
end
if numel(n)==15
    fprintf('您可以从%d站乘%s行%d路到%d站,途经%d个车站,转乘%s行%d路到%d站,途经%d个车站,再转乘%s行%d路直到%d站,途经%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!\n',n{1},n{2},n{3},n{4},n{5},n{6},n{7},n{8},n{9},n{10},n{11},n{12},n{13},n{14},n{15});
end
return

function [fee,d]=data()
data=importdata('d:\data.mat');
i=1;
while ~strcmp(data{i},'END')
    for j=1:4
        ls{(i+3)/4,j}=data{i-1+j};
    end
    i=i+4;
end
fee=ls(:,2);
siz=size(ls);
for i=1:siz(1)
    a=ls{i,3};
    b='0';
    for j=1:numel(a)
        if ~strcmp(a(j),'S')&~strcmp(a(j),'-')&~strcmp(a(j),'上')&~strcmp(a(j),'行')&~strcmp(a(j),':')&~strcmp(a(j),'环')
            b=strcat(b,a(j));
        end
    end
    b=b(2:numel(b));
    for k=1:numel(b)/4
        c(i,k)=str2num(b(4*(k-1)+1:4*k));
    end
end
for i=1:siz(1)
    a=ls{i,3};
    a1=ls{i,4};
    b1='';
    if strcmp(a1,'')&strcmp(a(1),'环')
        c1(i,1)=0;
    end
    if strcmp(a1,'')&strcmp(a(1),'S')
        for j=1:numel(a)
            if ~strcmp(a(j),'S')&~strcmp(a(j),'-')
                b1=strcat(b1,a(j));
            end
        end
        l=1;
        for k=numel(b1)/4:-1:1
            c1(i,l)=str2num(b1(4*(k-1)+1:4*k));
            l=l+1;
        end
    end
    b1='';
    if ~strcmp(a1,'')
        for j=1:numel(a1)
            if ~strcmp(a1(j),'S')&~strcmp(a1(j),'-')&~strcmp(a1(j),'下')&~strcmp(a1(j),'行')&~strcmp(a1(j),':')
                b1=strcat(b1,a1(j));
            end
        end
        for k=1:numel(b1)/4
            c1(i,k)=str2num(b1(4*(k-1)+1:4*k));
        end
    end
end
j=1;
for i=1:siz(1)
    d(j,1:numel(c(i,: )))=c(i,: );
    d(j+1,1:numel(c1(i,: )))=c1(i,: );
    bh(j,1)=i;
    j=j+2;
end
return

作者: ppv2k3    时间: 2011-8-20 23:01
感觉matlab好难学的~不过应用多
作者: [^CY^]    时间: 2011-8-20 23:50
好难。。。。。。。。。。。。
作者: 蓝色琉璃    时间: 2011-8-21 08:15
好难啊、、、、、
作者: 顺风航    时间: 2011-8-21 10:47
哇~~哇~~哇~~
作者: 顺风航    时间: 2011-8-21 10:49

作者: china19901015    时间: 2011-8-21 11:53
好难啊,,程序好长啊。。 你能说哪个句子出错了么?

作者: jjc616    时间: 2011-8-21 12:08
不是吧,这怎么调?
作者: 笑傲天方    时间: 2011-8-21 12:20
china19901015 发表于 2011-8-21 11:53
好难啊,,程序好长啊。。 你能说哪个句子出错了么?

第62行
   [row2 col2]=find(d==Fj(k,2));

作者: owujie    时间: 2011-8-21 20:19

作者: 心馨    时间: 2011-8-21 22:59
版主是怎么申请上的 哈哈
作者: abcdxyy    时间: 2012-2-11 20:46
这哪是matlab程序啊,是VC++程序。。。
作者: TangQiao    时间: 2012-2-19 17:54
楼主就不会注释一下吗?谁看得懂?
作者: 0xvirtual    时间: 2012-4-29 19:50





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5