diff --git a/include/eigenpy/eigen-allocator.hpp b/include/eigenpy/eigen-allocator.hpp
index 343f76811e353a42a7cd6dcada9992007633f3dc..ca66b7be6c84c67d68624e8df8d8bacba7434148 100644
--- a/include/eigenpy/eigen-allocator.hpp
+++ b/include/eigenpy/eigen-allocator.hpp
@@ -19,50 +19,67 @@ namespace eigenpy
     template<typename MatType, bool IsVectorAtCompileTime = MatType::IsVectorAtCompileTime>
     struct init_matrix_or_array
     {
+      static MatType * run(int rows, int cols, void * storage)
+      {
+        if(storage)
+          return new (storage) MatType(rows,cols);
+        else
+          return new MatType(rows,cols);
+      }
+      
       static MatType * run(PyArrayObject * pyArray, void * storage = NULL)
       {
         assert(PyArray_NDIM(pyArray) == 1 || PyArray_NDIM(pyArray) == 2);
 
         int rows = -1, cols = -1;
-        if(PyArray_NDIM(pyArray) == 2)
+        const int ndim = PyArray_NDIM(pyArray);
+        if(ndim == 2)
         {
           rows = (int)PyArray_DIMS(pyArray)[0];
           cols = (int)PyArray_DIMS(pyArray)[1];
         }
-        else if(PyArray_NDIM(pyArray) == 1)
+        else if(ndim == 1)
         {
           rows = (int)PyArray_DIMS(pyArray)[0];
           cols = 1;
         }
   
-        if(storage)
-          return new (storage) MatType(rows,cols);
-        else
-          return new MatType(rows,cols);
+        return run(rows,cols,storage);
       }
     };
 
     template<typename MatType>
     struct init_matrix_or_array<MatType,true>
     {
+      static MatType * run(int rows, int cols, void * storage)
+      {
+        if(storage)
+          return new (storage) MatType(rows,cols);
+        else
+          return new MatType(rows,cols);
+      }
+      
+      static MatType * run(int size, void * storage)
+      {
+        if(storage)
+          return new (storage) MatType(size);
+        else
+          return new MatType(size);
+      }
+      
       static MatType * run(PyArrayObject * pyArray, void * storage = NULL)
       {
-        if(PyArray_NDIM(pyArray) == 1)
+        const int ndim = PyArray_NDIM(pyArray);
+        if(ndim == 1)
         {
-          const int rows_or_cols = (int)PyArray_DIMS(pyArray)[0];
-          if(storage)
-            return new (storage) MatType(rows_or_cols);
-          else
-            return new MatType(rows_or_cols);
+          const int size = (int)PyArray_DIMS(pyArray)[0];
+          return run(size,storage);
         }
         else
         {
           const int rows = (int)PyArray_DIMS(pyArray)[0];
           const int cols = (int)PyArray_DIMS(pyArray)[1];
-          if(storage)
-            return new (storage) MatType(rows,cols);
-          else
-            return new MatType(rows,cols);
+          return run(rows,cols,storage);
         }
       }
     };