QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4181|回复: 13
打印 上一主题 下一主题

[问题求助] matlab程序出错,求高手指点

[复制链接]
字体大小: 正常 放大

8

主题

3

听众

773

积分

升级  43.25%

  • TA的每日心情
    开心
    2012-5-1 14:00
  • 签到天数: 138 天

    [LV.7]常住居民III

    群组Matlab讨论组

    群组南京邮电大学数模协会

    跳转到指定楼层
    1#
    发表于 2011-8-20 22:08 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    本帖最后由 笑傲天方 于 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
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    ppv2k3        

    0

    主题

    3

    听众

    100

    积分

    升级  0%

  • TA的每日心情
    无聊
    2014-10-3 08:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    [^CY^]        

    0

    主题

    3

    听众

    35

    积分

    升级  31.58%

    该用户从未签到

    回复

    使用道具 举报

    16

    主题

    3

    听众

    452

    积分

    升级  50.67%

  • TA的每日心情
    开心
    2012-2-14 02:50
  • 签到天数: 89 天

    [LV.6]常住居民II

    群组Matlab讨论组

    群组数学建模

    群组数学建模培训课堂2

    群组数学趣味、游戏、IQ等

    群组EXCEL

    回复

    使用道具 举报

    顺风航        

    12

    主题

    6

    听众

    418

    积分

    升级  39.33%

  • TA的每日心情
    难过
    2012-2-26 16:57
  • 签到天数: 77 天

    [LV.6]常住居民II

    群组2011年第一期数学建模

    群组Matlab讨论组

    回复

    使用道具 举报

    顺风航        

    12

    主题

    6

    听众

    418

    积分

    升级  39.33%

  • TA的每日心情
    难过
    2012-2-26 16:57
  • 签到天数: 77 天

    [LV.6]常住居民II

    群组2011年第一期数学建模

    群组Matlab讨论组

    回复

    使用道具 举报

    24

    主题

    9

    听众

    4478

    积分

  • TA的每日心情

    2012-9-19 16:55
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    邮箱绑定达人 新人进步奖 最具活力勋章 发帖功臣

    群组Matlab讨论组

    群组全国大学生数学建模竞

    群组数学建摸协会

    回复

    使用道具 举报

    jjc616 实名认证       

    12

    主题

    5

    听众

    1450

    积分

    升级  45%

  • TA的每日心情
    慵懒
    2016-1-21 16:24
  • 签到天数: 197 天

    [LV.7]常住居民III

    自我介绍
    我是一名大学生,热爱着数学模型

    社区QQ达人 新人进步奖

    群组2011年第一期数学建模

    群组2012第三期美赛培训

    群组科技写作基础培训

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    回复

    使用道具 举报

    8

    主题

    3

    听众

    773

    积分

    升级  43.25%

  • TA的每日心情
    开心
    2012-5-1 14:00
  • 签到天数: 138 天

    [LV.7]常住居民III

    群组Matlab讨论组

    群组南京邮电大学数模协会

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

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

    使用道具 举报

    owujie 实名认证       

    4

    主题

    3

    听众

    562

    积分

    升级  87.33%

  • TA的每日心情

    2014-9-23 07:59
  • 签到天数: 122 天

    [LV.7]常住居民III

    群组南京邮电大学数模协会

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-10-2 18:52 , Processed in 0.628693 second(s), 103 queries .

    回顶部