diff --git a/apps/compare_convergence.cpp b/apps/compare_convergence.cpp
index b154ac487d031e129229dbd475600eff8ef4fecb..e423cd2b8b6a7f7b690e430dab4bbe186a59487e 100644
--- a/apps/compare_convergence.cpp
+++ b/apps/compare_convergence.cpp
@@ -51,7 +51,6 @@ int main() {
 
     for (uint32_t i = 0; i < dims.size(); ++i) {
         uint32_t dim = dims[i];
-        objective.dim() = dim;
         initial_point.resize(dim);
         initial_point.fill(-1);
 
diff --git a/optimization/objectives/paraboloid.h b/optimization/objectives/paraboloid.h
index c10e1dbd4e7dbe16f21130e5098842e271d5e6ba..6355e2c7a84a05ce43a6c59ac2218a8121b3274a 100644
--- a/optimization/objectives/paraboloid.h
+++ b/optimization/objectives/paraboloid.h
@@ -15,28 +15,23 @@ public:
     static constexpr char const* name = "paraboloid";
 
     Paraboloid() {}
-    Paraboloid(uint32_t dim): dim_(dim) {}
-
-    uint32_t dim() const { return dim_; }
-    uint32_t& dim() { return dim_; }
 
     void operator()(Input const& x, Scalar& value) const {
+        uint32_t const dim = x.size();
         value = 0;
-        for (uint32_t d = 0; d < dim_; ++d) {
+        for (uint32_t d = 0; d < dim; ++d) {
             value += x[d] * x[d];
         }
     }
 
     void operator()(Input const& x, Scalar& value, Gradient& gradient) const {
+        uint32_t const dim = x.size();
         value = 0;
-        for (uint32_t d = 0; d < dim_; ++d) {
+        for (uint32_t d = 0; d < dim; ++d) {
             value += x[d] * x[d];
             gradient[d] = 2 * x[d];
         }
     }
-
-private:
-    uint32_t dim_;
 };
 
 }
diff --git a/optimization/objectives/rosenbrock.h b/optimization/objectives/rosenbrock.h
index 607436d4806f026f3d88875f4f068b41efda3749..be5021898affa0c9c7d0cd71ada4cc1f06d74607 100644
--- a/optimization/objectives/rosenbrock.h
+++ b/optimization/objectives/rosenbrock.h
@@ -11,14 +11,12 @@ class Rosenbrock {
 public:
     static constexpr char const* name = "rosenbrock";
 
-    Rosenbrock(): dim_(2) {}
-
-    uint32_t dim() const { return dim_; }
-    uint32_t& dim() { return dim_; }
+    Rosenbrock() {}
 
     void operator()(VectorNs<N> const& x, Scalar& value) {
+        uint32_t const dim = x.size();
         value = Scalar(0);
-        for (uint32_t i = 1; i < dim_; ++i) {
+        for (uint32_t i = 1; i < dim; ++i) {
             Scalar const x_squared = x[i - 1] * x[i - 1];
             Scalar const tmp_1 = (1 - x[i - 1]);
             Scalar const tmp_2 = (x[i] - x_squared);
@@ -27,10 +25,11 @@ public:
     }
 
     void operator()(VectorNs<N> const& x, Scalar& value, VectorNs<N>& gradient) {
+        uint32_t const dim = x.size();
         value = Scalar(0);
-        gradient.resize(dim_);
+        gradient.resize(dim);
         gradient.setZero();
-        for (uint32_t i = 1; i < dim_; ++i) {
+        for (uint32_t i = 1; i < dim; ++i) {
             Scalar const x_squared = x[i - 1] * x[i - 1];
             Scalar const tmp_1 = (1 - x[i - 1]);
             Scalar const tmp_2 = (x[i] - x_squared);
@@ -39,10 +38,6 @@ public:
             gradient[i] += 200 * tmp_2;
         }
     }
-
-private:
-    // This is redundant for N != -1.
-    uint32_t dim_;
 };
 
 }
diff --git a/optimization/optimizers/cma_es/main.cpp b/optimization/optimizers/cma_es/main.cpp
index eb159394daf3b5f522a7db99e22409d01cdf7cd7..b6c2da6531ab1facd7e18fe559979a086a843d03 100644
--- a/optimization/optimizers/cma_es/main.cpp
+++ b/optimization/optimizers/cma_es/main.cpp
@@ -54,10 +54,8 @@ int main(int const argc, char const** argv) {
     initial_std_dev.fill(std_dev);
 
     //using Objective = Paraboloid<Vector2<Scalar>>;
-    //Objective objective(dim);
     using Objective = Rosenbrock<-1>;
     Objective objective;
-    objective.dim() = dim;
 
     CmaEs optimizer(dim, pop_size, seed, max_evaluations, max_iterations, rel_y_tol);
     CmaEsLogEverything log;
diff --git a/optimization/optimizers/conjugate_gradient_descent/main.cpp b/optimization/optimizers/conjugate_gradient_descent/main.cpp
index 215de9bb43bdc0e20ad224af20e71e366692d2cf..73276d594679f83d185a789988f26f8f7121a711 100644
--- a/optimization/optimizers/conjugate_gradient_descent/main.cpp
+++ b/optimization/optimizers/conjugate_gradient_descent/main.cpp
@@ -47,10 +47,8 @@ int main(int const argc, char const** argv) {
     }
 
     //using Objective = Paraboloid<Vector2<Scalar>>;
-    //Objective objective(dim);
     using Objective = Rosenbrock<-1>;
     Objective objective;
-    objective.dim() = dim;
 
     ConjugateGradientDescent<-1> optimizer(
         gradient_threshold,
diff --git a/optimization/optimizers/gradient_descent/main.cpp b/optimization/optimizers/gradient_descent/main.cpp
index 3ab9d34129d6cd234c22ab19d0e8e1ce09ae6e07..e7872627751e586216f7571dde06edb0a367fce2 100644
--- a/optimization/optimizers/gradient_descent/main.cpp
+++ b/optimization/optimizers/gradient_descent/main.cpp
@@ -46,10 +46,8 @@ int main(int const argc, char const** argv) {
     }
 
     //using Objective = Paraboloid<Vector2<Scalar>>;
-    //Objective objective(dim);
     using Objective = Rosenbrock<-1>;
     Objective objective;
-    objective.dim() = dim;
 
     GradientDescent<-1> optimizer(learning_rate, max_evaluations, gradient_threshold);
     GradientDescentLogEverything<-1> log;
diff --git a/optimization/optimizers/nelder_mead/main.cpp b/optimization/optimizers/nelder_mead/main.cpp
index 8d73373a5b9b55d8f06a0a81388deaa3cc0aee5e..95c1c4355bc8b07950a1b0eae41ffab66b414ca9 100644
--- a/optimization/optimizers/nelder_mead/main.cpp
+++ b/optimization/optimizers/nelder_mead/main.cpp
@@ -38,10 +38,8 @@ int main(int const argc, char const** argv) {
     }
 
     //using Objective = Paraboloid<Vector2<Scalar>>;
-    //Objective objective(dim);
     using Objective = Rosenbrock<-1>;
     Objective objective;
-    objective.dim() = dim;
 
     NelderMead<-1> optimizer(max_evaluations, relative_y_tolerance);
     NelderMeadLogEverything<-1> log;