2016-03-07 2 views
0

У меня проблемы с повторением нескольких операторов if более восьми раз. Код, кажется, отлично работает для первых нескольких сравнений, выполняет арифметику и возвращает/сохраняет строку вывода 'export_data'. Однако после этого он возвращает только условие и ответ else. Оцененные существа переменных имеют по 1500 рядов. Я добавил код ниже и две фотографии с результатами. Любое понимание будет очень оценено.Matlab не принимает решения, если утверждения

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 

никогда не будет печатать "привет", даже если 2 и 3 оба больше 1. Это связано с тем, что оператору if необходимо оценить либо скаляр true, либо false. Если используется вектор, то для определения того, является ли оператор истинным или нет, используется только первый элемент (сравнения между другими элементами игнорируются). Вы можете использовать any и all, если вы хотите применить условия ко всем элементам.

Если Forecast_WS и Observed_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

Смежные вопросы