-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinContStimulusEnsemble.m
59 lines (45 loc) · 1.93 KB
/
LinContStimulusEnsemble.m
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
classdef LinContStimulusEnsemble < ContinuousStimulusEnsemble
properties
circular = false;
end
methods
function obj = LinContStimulusEnsemble(varargin)
% superclass constructor
obj = obj@ContinuousStimulusEnsemble();
switch nargin
case 0
% do nothing
case 2
obj.ensemble = double(varargin{1}(:)');
obj.pS = double(varargin{2}(:)');
assert(all(diff(diff(obj.ensemble)) < 1e-8), 'Stimulus distribution points must be regularly spaced')
obj.width = diff(obj.ensemble(1:2));
obj.lowerLimit = obj.ensemble(1);
obj.upperLimit = obj.ensemble(end);
obj.pS = obj.pS ./ obj.integrate(obj.pS, 2);
case 3
bottom = double(varargin{1});
top = double(varargin{2});
number = double(varargin{3});
spacing = (top - bottom) / double(number - 1);
assert(mod(number, 1) == 0, 'Non-integer number of stimuli')
assert(top > bottom, 'Upper limit must be greater than lower limit')
obj.ensemble = bottom : spacing : top;
obj.width = spacing;
obj.lowerLimit = bottom;
obj.upperLimit = top;
obj.pS = 1.0 ./ (top - bottom) .* ones(1, obj.n);
otherwise
error('Wrong number of arguments')
end
end
function p = pSint(obj, s)
% piecewise linear interpolation
p = interp1q(obj.ensemble', obj.pS', s(:))';
end
function integral = integrate(obj, ords, dim)
% trapezoid rule
integral = trapz(ords, dim) .* obj.width;
end
end
end