Arguments for custom unary/binaryExpr() eigen3

General Tech Bugs & Fixes 2 years ago

0 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

I'm trying to eliminate nested for loops by making use of coefficient-wise operations on eigen3 objects. In order to achieve this I have to generalize an already existing function such that I can make us of custom coefficient-wise operations.

I found that eigen provides two functions, unaryExpr() and binaryExpr() (documentation), that allow to implement a custom coefficient-wise operation on eigen Arrays. However, as far as I understand, you can only give one or two arguments to these functions which represent the coefficients from the array itself. I would like to pass other arguments as well to this function since I need these other arguments to complete the calculation.

I would like to generalize the following function

inline Complex expValue(int twoMS, int twoMSPrime, const Matrix2cd& mat)
{
  const Vector2cd& bra = getSpinBasisState(twoMSPrime);
  const Vector2cd& ket = getSpinBasisState(twoMS);

  return bra.adjoint()*mat*ket;
}

All the possible combinations of values for twoMS and twoMSPrime I have stored in an array like this

Eigen::ArrayXXd spinCGPart(16, 2);

So, 16 different combinations and two b.com/tag/columns">columns, one for twoMS and one for twoMSPrime. Instead of looping over all the different combinations, I would like to implement a coefficient-wise operation like so

Eigen::ArrayXXcd result(16, 1);
result = spinCGPart.col(0).binaryExpr(spinCGPart.col(1), generalExpVal);

Where generalExpVal should be something like

complex generalExpVal(int a, int b, const Matrix2cd& mat) const 
{
  const Vector2cd& bra = getSpinBasisState(b);
  const Vector2cd& ket = getSpinBasisState(a);

  return bra.adjoint()*mat*ket;
}

I'm stuck with implementing this last function. The documentation for the binaryExpr() looks like it doesn't allow extra parameters to be given to the function. Is this the case? I need to b.com/tag/pass">pass mat as an argument since it changes constantly throughout the calculation. Any suggestion regarding eigen or another way of thinking about the problem would be very helpful and appreciated!

0 views
0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.