2015-04-14 2 views
-1

У меня проблема в начале моей функции. Функция состоит в том, чтобы объединить несколько столбцов данных с некоторыми объектами. Ошибка происходит в начале функции. Это говорит следующим образом:Ошибка объявления переменной

Ошибка в find_by_coor (линия 2) для г = 1: длина (obj_ac)

здесь только объявление переменной и петли, но Matlab так или иначе возвращается ошибка. Я понятия не имею, чтобы кто-то помог мне. Я прикрепил свой код следующим образом. Заранее большое спасибо.

function arr = find_by_coor(obj_ac,obj_gps,obj_sen_dir,lat1,long1,lat2,long2) 
    for i = 1:length(obj_ac) 
     if eq(obj_sen_dir(i).sensor,4) && strcmp(obj_sen_dir(i).direction,'outbound') 
      ind = obj_gps(i).save_var_gps(:,1)>lat1; 
      if isempty(find(ind)) == 1 
       continue 
      end 
      temp = obj_gps(i).save_var_gps(ind,:); 
      ind = temp(:,1)<lat2; 
      if isempty(find(ind)) == 1 
       continue 
      end 
      temp2 = temp(ind,:); 
      ind = temp2(:,2)<long1; 
      if isempty(find(ind)) == 1 
       continue 
      end 
      temp3 = temp2(ind,:); 
      ind = temp3(:,2)>long2; 
      if isempty(find(ind)) == 1 
       continue 
      end 
      temp4 = temp3(ind,:); 
      mint = min(temp4(:,5))-min(obj_gps(i).save_var_gps(:,5)); 
      maxt = max(temp4(:,5))-min(obj_gps(i).save_var_gps(:,5)); 
      if isempty(mint) == 1 || isempty(maxt) == 1 
       continue 
      end 
      if floor(mint*(1.6516e+03)) == 0 || floor(maxt*(1.6516e+03)) == 0 
       continue 
      end 
      temp5 = obj_ac(i).save_var(floor(mint*(1.6516e+03)):floor(maxt*(1.6516e+03))); 
      temp6 = abs(fft(temp5)); 
      arr(i,:) = [i objs(i).daten var(temp5) max(temp5) min(temp5) mean(temp5) std(temp5) mode(temp5) var(temp6) max(temp6) min(temp6) mean(temp6) std(temp6) mode(temp6)]; 
      disp(i); 
     end 
    end 
end 
+0

какое значение вы передаете в переменной 'obj_ac'? –

+1

Опубликовать полное сообщение об ошибке, там должно быть больше, чем вы опубликовали. – David

+1

Кажется, что некоторые из сообщений об ошибке отсутствуют, но я думаю, что если бы вы опубликовали, что он сказал бы «Недостаточно входных аргументов». Это означает, что вы, вероятно, называете функцию «myVar = find_by_coor». Вы должны указать все аргументы как входные данные как myVar = find_by_coor (arg1, arg2, ...) '. Однако в будущем помните, что причина ошибки так же важна, как и в случае ее возникновения. – patrik

ответ

1

Проблема заключается в том, что при запуске функции выходная переменная arr никогда не назначается. В Matlab вы всегда должны назначать вывод функции, если вы решите использовать его в определении. Например

function [a,b] = setAB() 
err = 0; % Gives an error if err is true 
a = 1; 

if ~err 
    b = 1; 
end 

Причина, безусловно, что для некоторых входов, все значения попадают в одну из заявлений, если и вы никогда ничего не достигнет точки, где arr назначена. Хорошим решением для этого является назначение значения по умолчанию для arr в начале. Это может быть, например, nan или -1, или в вашем случае может быть массив arr = nan(wanted size) или arr = -1*ones(wanted size). Если вы не перераспределяете arr, скорее всего, вы получите ошибку «матрица за пределами границ», если вы решите первую проблему.

Это не значит, что вам всегда нужно иметь выход.

function [] = noOutput() 
disp('Hi, I am a void!'); 

Вы также можете вернуть столько значений, сколько количества выходов.

function varargout = variableArgs() 
a = 1; 
b = 2; 
c = 3; 

if (nargout == 1) 
    varargout{1} = a; 
elseif (nargout == 2) 
    varargout{1} = b; 
    varargout{2} = c; 
else 
    error('Wrong number of output arguments!'); 
end 

Я не говорю, какой из подходов вы должны использовать или что любой из них хорош. Обычно я использую varargout в случае, если я напишу функции построения графика. Тогда я могу ничего не возвращать, если у меня нет выходного аргумента. Затем я хочу вернуть дескрипторы или любую дополнительную информацию. Кроме того, как вы, возможно, поняли, есть также varargin, которые могут быть более полезными.

+0

Это сработало, спасибо большое! – Tom0728

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