声明变量的错误

时间:2015-04-14 05:42:19

标签: matlab

我的功能开头有问题。该功能是组合来自某些对象的多个数据列。错误发生在函数的开头。它说如下:

  

find_by_coor出错(第2行)          对于i = 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

1 个答案:

答案 0 :(得分:1)

问题是当您运行该函数时,永远不会分配输出变量arr。在Matlab中,如果您选择在定义中使用它,则必须始终指定一个函数输出。例如

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

if ~err
    b = 1;
end

原因很明显,对于某些输入,所有值都属于if语句之一,并且您永远不会达到arr的分配点。一个很好的解决方案是在开头为arr分配一个默认值。例如,可能是nan-1,或者在您的情况下可能是数组arr = nan(wanted size)arr = -1*ones(wanted size)。如果你没有预先分配arr,你可能会得到一个超出界限的矩阵&#34;如果错误,你应该解决第一个问题。

这并不意味着你总是需要输出。

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可能更有用。