2013-05-30 37 views
1

我在包含一些有關模糊集的基本功能的文件夾中有一些代碼。這些文件夾是@fset@mftrap。我可以毫無問題地從這些文件夾調用函數。腳本無法在matlab中找到/調用函數

現在我定義了一個新函數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被聲明爲一個類或某事的事實。

希望任何人都可以告訴我發生了什麼問題。

CNC中

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

回答

2

文件的文件夾@fset是類fset的所有的「方法」。這意味着,他們應該全部「對」fset對象進行操作。事實上,他們都以fset作爲他們的第一個參數。

  • 如果你的方法是這樣的,即它作用於fset對象,那麼它在@fset文件夾中的歸屬。在這種情況下,您需要編輯定義類的文件/@fset/fset.m,並將其添加到methods部分。它應該變得可見。

  • 如果你的方法是不是這樣的,即它一個fset對象進行操作,那麼它不屬於嚴格的@fset文件夾 - 即使它有關。這只是法律!你可以把它放在其他地方。

看到here對如何組織類的文件夾,並 here如何編輯類定義文件。

+0

我將'@ fset'文件夾更改爲單個類文件,請參閱我的更新。但是,我怎樣才能讓tsmodel可以接受fset對象的單元數組? –

+1

這是一個很好的問題,我認爲這是matlab崩潰的一個地方。這不是一個真正的面向對象的語言,AFAIK沒有一個可以讓你輕鬆完成這些事情的集合框架。一種解決方案是,如果您只是在現有方法上遍歷單元格項目,則可以使用內置的'cellfun'等等,這將很好地平行化。如果你正在做更復雜的事情,我有一種感覺,你需要單獨的功能的單元版本。 –