Mercurial > repos > public > sbplib
changeset 607:0546de4b31a2 feature/grids
Make grid.evalOn faster.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Sat, 14 Oct 2017 22:28:27 -0700 |
parents | c14875cf7ae6 |
children | c923fe6197ff 0813d700a816 |
files | +grid/evalOn.m |
diffstat | 1 files changed, 33 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/+grid/evalOn.m Sat Oct 14 22:24:19 2017 -0700 +++ b/+grid/evalOn.m Sat Oct 14 22:28:27 2017 -0700 @@ -23,8 +23,8 @@ end - % Get coordinates and convert to cell array for easier use as a parameter - x = num2cell(g.points()); + % Get coordinates + x = g.points(); % Find the number of components if size(x,1) ~= 0 @@ -32,17 +32,43 @@ else x0 = num2cell(ones(1,size(x,2))); end - f0 = func(x0{:}); + + dim = length(x0); + % Evaluate f0 = func(x0(1),x0(2),...,x0(dim)); + if(dim == 1) + f0 = func(x0); + else + eval_str = 'f0 = func(x0(1)'; + for i = 2:dim + eval_str = [eval_str, sprintf(',x0(%d)',i)]; + end + eval_str = [eval_str, ');']; + eval(eval_str); + end + + % k = number of components k = length(f0); if size(f0,2) ~= 1 error('grid:evalOn:VectorValuedWrongDim', 'A vector valued function must be given as a column vector') end + % Evaluate gf = func(x(:,1),x(:,2),...,x(:,dim)); + if(dim == 1) + gf = func(x); + else + eval_str = 'gf = func(x(:,1)'; + for i = 2:dim + eval_str = [eval_str, sprintf(',x(:,%d)',i)]; + end + eval_str = [eval_str, ');']; + eval(eval_str); + end + + % Reorganize gf + gf_temp = gf; gf = zeros(g.N*k, 1); - for i = 1:g.N - % (1 + (i-1)*k):(i*k) - % func(x{i,:}) - gf((1 + (i-1)*k):(i*k)) = func(x{i,:}); + for i = 1:k + gf(i:k:end) = gf_temp((i-1)*g.N + 1 : i*g.N); end end \ No newline at end of file