1

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

现在我定义了一个新函数,tsmodel.m. 我把它放在根目录中,即

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

我可以tsmodel.mexample.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被声明为类或其他东西。

希望任何人都可以告诉我出了什么问题。

-编辑-

对不起,我忘了包括文件: 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
4

1 回答 1

2

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

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

  • 如果您的方法不是这样,即它不对对象进行操作fset,那么它不严格属于该@fset文件夹——即使它是相关的。那只是法律!你可以把它放在其他任何地方。

有关如何组织类文件夹的信息, 请参见此处,有关如何编辑类定义文件的信息,请参见此处。

于 2013-05-30T00:37:46.990 回答