1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
function y = sigmoid_train(t, ranges, rc)
// Evaluate a train of sigmoid functions at T.
//Calling Sequence
//y = sigmoid_train(t, ranges, rc)
//Parameters
//t: integer
//ranges: matrix
//rc:timeconstant
//Description
//The number and duration of each sigmoid is determined from RANGES. Each row of RANGES represents a real interval, e.g. if sigmoid 'i' starts at 't=0.1' and ends at 't=0.5', then 'RANGES(i,:) = [0.1 0.5]'. The input RC is an array that defines the rising and falling time constants of each sigmoid. Its size must equal the size of RANGES.
//Examples
//sigmoid_train(0.1,[1:3],4)
//Output :
// ans =
//
// 0.2737470
funcprot(0);
nRanges = size (ranges, 1);
if isscalar (rc)
rc = rc * ones (nRanges,2);
elseif or( size(rc) ~= [1 1])
if length(rc) ~= nRanges
error('signalError','Length of time constant must equal number of ranges.')
end
if isrow (rc)
rc = rc';
end
rc = repmat (rc,1,2);
end
flag_transposed = %F;
if iscolumn (t)
t = t.';
flag_transposed = %T;
end
[ncol nrow] = size (t);
T = repmat (t, nRanges, 1);
RC1 = repmat (rc(:,1), 1, nrow);
RC2 = repmat (rc(:,2), 1, nrow);
a_up = (repmat (ranges(:,1), 1 ,nrow) - T)./RC1;
a_dw = (repmat (ranges(:,2), 1 ,nrow) - T)./RC2;
Y = 1 ./ ( 1 + exp (a_up) ) .* (1 - 1 ./ ( 1 + exp (a_dw) ) )
y = max(Y,'r');
if flag_transposed
y = y.';
end
endfunction
|