脚本无法在matlab中找到/调用函数

时间:2013-05-30 00:19:42

标签: matlab

我在一个文件夹中有一些代码,其中包含一些关于模糊集的基本功能。这些文件夹为@fset@mftrap。我可以毫无问题地从这些文件夹中调用这些函数。

现在我定义了一个新函数tsmodel.m。我把它首先放在根里,即

/root
 + /@fset
 + /@mftrap
 - tsmodel.m
 - example.m

我可以从tsmodel.m致电example.m。现在我把它放在@fset文件夹中,因为它是相关的。但是现在我的example.m文件由于某种原因无法找到tsmodel.m,而我仍然可以调用@fset文件夹中的所有其他功能。我收到以下错误:

Undefined function 'tsmodel' for input arguments of type
'cell'.

Error in example (line 21)
Y = tsmodel(X,t,a,b);

我认为问题在于文件夹@fset被声明为类或其他东西。

希望有人能告诉我出了什么问题。

-edit -

抱歉,我忘了包含这些文件: https://dl.dropboxusercontent.com/u/20782274/fuzzy.zip

-edit2 -

我现在将@fset文件夹更改为单个类文件。我现在如何设置tsmodel的方法,以便它可以接受fset方法的单元格数组?

    classdef fset
    properties (SetAccess = private)
        mu
        x
    end

    methods  
        function A = fset(x,m)
        % constructor for a fuzzy set
            if nargin < 2 
                m = ones(size(x)); 
            end

            if isa(m,'fset') 
                A = m; 
                return; 
            end

            if isa(m,'mftrap'), 
               A.mu = mu(x,m); 
            else 
               A.mu = m(:); 
            end

            A.x = x(:);
        end

        function h = plot(A,linetype)
        % plot membership function
            if nargin < 2
                linetype = 'b'; 
            end

            A = A(:);

            hs = ishold;

            for i = 1 : length(A)
               handle(i) = plot(A(i).x,A(i).mu,linetype);
               hold on
            end

            if ~hs
                hold off;
            end

            title(inputname(1))
            ylabel('mu');
            xlabel('x');

            if nargout
                h = handle;
            end
        end

        function display(A)
        % display fuzzy set as a pointwise list
            A  = A(:);
            lA = length(A);

            for i = 1:lA
                if iscell(A(i).x)
                    if lA > 1
                        str = sprintf('%s(%d) = \n\n  %s', ...
                                      inputname(1),i,'fuzzy relation');
                    else   
                        str = sprintf('%s = \n\n  %s', ...
                                      inputname(1),'fuzzy relation');
                    end;

                    disp(str);
                    disp(A(i).mu);
                else   
                    list = [A(i).mu'; A(i).x'];
                    list = list(:);

                    if size(list,1) < 10,
                        s = sprintf('%1.2f/%1.2f, ',list);
                    else
                        list1 = list(1:4,:);
                        list2 = list(end-3:end,:);
                        s = [sprintf('%1.2f/%1.2f, ',list1(:)) '..., ' ...
                             sprintf('%1.2f/%1.2f, ',list2(:))];
                    end;

                    if lA > 1,
                        str = sprintf('%s(%d) = \n\n  fuzzy set\n  { %s }', ...
                                      inputname(1),i,s(1:end-2));
                    else   
                        str = sprintf('%s = \n\n  fuzzy set\n  { %s }', ...
                                      inputname(1),s(1:end-2));
                    end;

                    disp(str);

                end
            end
        end

        function Y = tsmodel(A,X,a,b)
        % TSMODEL
        % input:
        %   X, dataset
        %   A, fuzzy set
        %   a, affine linear function parameter
        %   b, affine linear function parameter
        % output:
        %   Y, output

            % check input
            if isempty(X) || isempty(A) || ...
               isempty(a) || isempty(b)
                error('Not all necesary parameters are given.');
                return;
            end

            % check if singleton model (only b are given)
            if size(a) == 0
                a = zeros(1,length(b));
            end

            % check dimension A and a and trap and b
            if length(A) ~= length(a) || length(A) ~= length(b)
                error('Dimensions do not match');
                return;
            end

            % init storage variables
            Y      = zeros(length(X),1);
            weight = zeros(length(A),1);

            % for each x in X
            for k = 1:length(X)

                % for each rule
                for i = 1:length(A)
                    weight(i) = mu(X(k),A{i});
                end

                % compute weighted mean
                Y(k) = sum(weight .* (a*X(k) + b)) / sum(weight);
            end
        end
    end
end

1 个答案:

答案 0 :(得分:2)

@fset文件夹中的文件是类fset的所有“方法”。这意味着,他们应该“操作”fset个对象。事实上,他们都将fset作为第一个参数。

  • 如果您的方法是这样的,即它对fset个对象起作用,那么它确实属于@fset文件夹。在这种情况下,您需要编辑定义类的文件/@fset/fset.m,并将其添加到methods部分。然后它应该可见。

  • 如果您的方法不是这样,即fset对象上运行,那么它并不严格属于{{1} }文件夹 - 即使它是相关的。那只是法律!你可以把它放在其他任何地方。

请参阅here了解如何组织班级文件夹,以及 here了解如何编辑类定义文件。