我在包含一些有關模糊集的基本功能的文件夾中有一些代碼。這些文件夾是@fset
和@mftrap
。我可以毫無問題地從這些文件夾調用函數。腳本無法在matlab中找到/調用函數
現在我定義了一個新函數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
被聲明爲一個類或某事的事實。
希望任何人都可以告訴我發生了什麼問題。
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
我將'@ fset'文件夾更改爲單個類文件,請參閱我的更新。但是,我怎樣才能讓tsmodel可以接受fset對象的單元數組? –
這是一個很好的問題,我認爲這是matlab崩潰的一個地方。這不是一個真正的面向對象的語言,AFAIK沒有一個可以讓你輕鬆完成這些事情的集合框架。一種解決方案是,如果您只是在現有方法上遍歷單元格項目,則可以使用內置的'cellfun'等等,這將很好地平行化。如果你正在做更復雜的事情,我有一種感覺,你需要單獨的功能的單元版本。 –