It's difficult to know which way to go without being able to assert how
much work it would be in your case.
Since you spoke about template functions, I assume you have a practical way
to know at compile time if you have an array or a double. In this case and
if you have problems with only a reasonable number of methods of ArrayXd, I
think you should use templates and overcome the problems with free
functions with overloads for ArrayXd and double. For example if you need to
call ArrayXd::foo, you could create a function foo(const ArrayXd& a)
{return a.foo();} and an overload foo(double) returning whatever is
adequate.Best regards, Adrien On Tue, Jul 28, 2020 at 10:05 PM Mario Azcueta <[email protected]> wrote: > Is there a way of adding/subtracting/multiplying two Eigen::ArrayXd arrays > both when (a) they have dimension N, and (b) when one of them has dimension > N and the other dimension 1? > > I'd ideally like that the array with size=1 is treated like a scalar for > these operations. I'm somewhat trying to replicate the way Matlab behaves. > > As an example, I'd the code below to work both when a1 and a2 have the > same size, as well as when one of them has size=1 and the other size=N: > > ArrayXd add_arrays(const ArrayXd& a1, const ArrayXd& a2) > { > return a1 + a2; > } > > Of course, this could be solved with an if statement, but I want to avoid > that since my actual code would require to write a long function verifying > all combinations of sizes (they're many args). Also, writing a template > function gets me problems when trying to use some ArrayXd methods and I > pass a double. > > I've looked into the EIGEN_ARRAYBASE_PLUGIN preprocessor which may seem > like the way to extend this behavior, but I'm not sure this is the right > way.. any advice will be welcome. > > Note: I've also post this question here > > https://stackoverflow.com/questions/63074198/c-eigen-treat-single-element-array-as-scalar-for-arithmetc-operations >
