From 4ce715eae645f56c4f05dc3fda335631c2efe848 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Thu, 13 Oct 2011 13:39:46 +0200
Subject: [PATCH] Make duneevaluate work with row vectors of input

---
 src/duneevaluate.cc | 15 ++++++++++-----
 src/foo.m           |  6 +++++-
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/duneevaluate.cc b/src/duneevaluate.cc
index d788ebf5..a6cb3ac7 100644
--- a/src/duneevaluate.cc
+++ b/src/duneevaluate.cc
@@ -11,12 +11,11 @@
 
 #include <cassert>
 
-DEFUN_DLD(duneevaluate, args, nargout, "duneevaluate(y)\n\
+DEFUN_DLD(duneevaluate, args, nargout, "duneevaluate(A)\n\
 \n\
-Evaluate x -> 1/2<Ax,x> - <b,x> + H(|x|) at y using DUNE\n") {
+Evaluate x -> 1/2<Ax,x> - <b,x> + H(|x|) at each point y that is a column vector of A using DUNE\n") {
   assert(args.length() == 1);
   assert(nargout <= 1);
-  ColumnVector point(args(0).vector_value());
 
   int const dim = 2;
 
@@ -35,7 +34,13 @@ Evaluate x -> 1/2<Ax,x> - <b,x> + H(|x|) at y using DUNE\n") {
   Functional J(A, b, Dune::MyNonlinearity<dim>(f));
   // }}}
 
+  Matrix points(args(0).matrix_value());
+  size_t const columns = points.columns();
+  RowVector ret(columns);
   Functional::SmallVector our_point;
-  Dune::octaveToDune<dim>(point, our_point);
-  return octave_value(J(our_point));
+  for (size_t i = 0; i < columns; ++i) {
+    Dune::octaveToDune<dim>(points.column(i), our_point);
+    ret(i) = J(our_point);
+  }
+  return octave_value(ret);
 }
diff --git a/src/foo.m b/src/foo.m
index c4bffb17..c1c6e859 100644
--- a/src/foo.m
+++ b/src/foo.m
@@ -11,12 +11,16 @@ y = -125:1:50;
 xlabel('x')
 ylabel('y')
 
+tic
 for i=1:length(y)
+  a = zeros(2,length(x));
   for j=1:length(x)
-    f(i,j) = duneevaluate([ X(i,j); Y(i,j) ]);
+    a(:,j) = [ X(i,j); Y(i,j) ];
   end
+  f(i,:) = duneevaluate(a);
 end
 clear X Y;
+toc
 
 surf(x, y, f)
 hold on;
-- 
GitLab