2016-03-07 102 views
0

我在遍历几个if语句超过8次时遇到了一些问题。该代码似乎在前几次比较中工作正常,执行算术运算并返回/保存输出行'export_data'。但是,在此之后,它仅返回else条件和响应。被评估的变量每个都有1500行。我已经添加了下面的代码和两张显示输出的照片。任何洞察力将非常感激。Matlab不解决if语句

function [export_data] = WS_Zones(Forecast_WS, Observed_WS) 
if (Forecast_WS > Observed_WS) 
    WS_Zone_1 = Observed_WS.*1.24; 
    WS_Zone_2 = Observed_WS.*1.28; 
elseif (Forecast_WS < Observed_WS) 
    WS_Zone_1 = Observed_WS.*0.76; 
    WS_Zone_2 = Observed_WS.*0.72; 
else 
    WS_Zone_1 = Observed_WS; 
    WS_Zone_2 = Observed_WS; 
end 
export_data=[Forecast_WS Observed_WS WS_Zone_1 WS_Zone_2]; 
filename = 'testdata.xlsx'; 
sheet = 1; 
xlRange = 'A1'; 
xlswrite(filename,export_data,sheet,xlRange) 
end 
+0

Matlab软件行为罚款。我建议你阅读[if](http://www.mathworks.com/help/matlab/ref/if.html?requestedDomain=www.mathworks.com)文档,特别是“比较阵列”和“测试阵列为平等“。 –

+1

如果'Forecast_WS'和'Observed_WS'不是标量,'如果Forecast_WS> Observed_WS'只取决于每个元素中第一个元素的比较。 – horchler

回答

2

本声明:

if [1 2 3] > [1 1 1] 
    disp('hello'); 
end 

永远不会打印 “你好”,即使23都大于1。这是因为if声明需要评估为标量truefalse。如果使用矢量,则只使用第一个元素来确定语句是否为真(忽略其他元素之间的比较)。如果您想对所有元素应用条件,则可以使用anyall

如果Forecast_WSObserved_WS不是标量,那么你需要换你if声明中for循环,例如:

WS_Zone_1 = Observed_WS; 
WS_Zone_2 = Observed_WS; 
for i = 1:numel(Forecast_WS) 
    if Forecast_WS(i) > Observed_WS(i) 
     WS_Zone_1(i) = Observed_WS(i).*1.24; 
     WS_Zone_2(i) = Observed_WS(i).*1.28; 
    elseif Forecast_WS(i) < Observed_WS(i) 
     WS_Zone_1(i) = Observed_WS(i).*0.76; 
     WS_Zone_2(i) = Observed_WS(i).*0.72; 
    end 
end 

或使用logical indexing矢量化它:

WS_Zone_1 = Observed_WS; 
WS_Zone_2 = Observed_WS; 
idx = (Forecast_WS > Observed_WS); 
WS_Zone_1(idx) = Observed_WS(idx).*1.24; 
WS_Zone_2(idx) = Observed_WS(idx).*1.28; 
idx = (Forecast_WS < Observed_WS); 
WS_Zone_1(idx) = Observed_WS(idx).*0.76; 
WS_Zone_2(idx) = Observed_WS(idx).*0.72; 
+0

非常感谢@horchler,两种解决方案都很完美。 – Dan