如果和elseif,只有第一行工作?

时间:2015-03-07 23:12:01

标签: matlab if-statement

L=1; Nx=51; PeriodicFlag=1; T=15; Nt=51;
spacedef='Pade6FirstDeriv'; casedef='LinearAdvection';


if (spacedef == 'Pade6FirstDeriv')
    D1 = sparse(Pade6(Nx,dx,PeriodicFlag)); 
elseif (spacedef == 'Upwind3FirstDeriv')
    D1 = sparse(Upwind3(Nx,dx,PeriodicFlag));
elseif (spacedef == 'Central4FirstDeriv')
    D1 = sparse(Central4(Nx,dx,PeriodicFlag));    
elseif (spacedef == 'Central2FirstDeriv')
    D1 = sparse(Central2(Nx,dx,PeriodicFlag));
else
    error(sprintf('Unknown spacedef = %s',spacedef));
    end

在上面的代码中,if部分是我构建的函数的一小部分。我试图让函数根据我的输入(spacedef)知道要使用哪些方法。 Central2,Central4,Upwind3和Pade6是我写过的其他功能。奇怪的是,当spacedef = / = to' Pade6FirstDeriv'时,我会得到一个错误,指出错误使用==,Matrix维度必须同意。我已经尝试交换if循环的顺序(通过在循环的第一行放置Central4,Central2,Pade6和Upwind3),似乎只有循环的顶行才能工作(elseifs是不工作)。如果有人可以帮助我,我会非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,当人们第一次开始在MATLAB中比较字符串时,这是一个常见错误,而strcmpstrcmpi通常是解决方案。

然而,评论中的问题链接的一个解决方案没有出现,我认为看起来更好的解决方案是switch声明:

switch (spacedef)
    case('Pade6FirstDeriv')
        D1 = sparse(Pade6(Nx,dx,PeriodicFlag)); 

    case('Upwind3FirstDeriv')
        D1 = sparse(Upwind3(Nx,dx,PeriodicFlag));

    case('Central4FirstDeriv')
        D1 = sparse(Central4(Nx,dx,PeriodicFlag));    

    case('Central2FirstDeriv')
        D1 = sparse(Central2(Nx,dx,PeriodicFlag));

    otherwise
        error(sprintf('Unknown spacedef = %s',spacedef));
end

注意:如果我希望其他人使用我的代码进行字符串比较,我通常会lower输入,以便比较不区分大小写,尽管我在这里没有这样做。