在 Eigen(c++) 中使用 noalias 之前是否需要检查指针

Do I need to check the pointer before using noalias in Eigen(c++)

假设有三个矩阵a,b,c a 和 c 共享同一个缓冲区,但名称不同

应该像

那样做一些检查
if(a.data() == c.data()){
    a = b * c;
}else{
    a.noalias() = b * c;
}

或者我可以只写 a = b + c?

编辑:完整示例

#include <Eigen/Dense>

#include <iostream>

using namespace Eigen;

template<typename Derived>
void sigmoid(MatrixBase<Derived> const &input, MatrixBase<Derived> const &weight, 
             MatrixBase<Derived> &output)
{
    output = weight * input;
    output= 1.0 / (1.0 + (-1.0 * output.array()).exp());
}

int main()
{
    MatrixXd weight = MatrixXd::Random(2, 2);
    MatrixXd input = MatrixXd::Random(2, 2);
    MatrixXd activation;
    for(size_t i = 0; i != 2; ++i){
        MatrixBase<MatrixXd> const &Temp = 
                i == 0 ? input : activation;
        sigmoid(Temp , weight, activation);
    }
}  

例子已经简化了,例子是,当i == 0时,应该输入Temp,当不是时,应该是activation。

您对数据指针将匹配的基本假设不正确。只是为了证明这一点,试试这个:

Eigen::MatrixXd aa = Eigen::MatrixXd::Random(5,5);
Eigen::Map<Eigen::MatrixXd> gg(aa.data()+5, 4, 5);
std::cout << aa.data() << "\n";
std::cout << gg.data() << "\n";

因此,您必须在编译时知道它们是否共享相同的缓冲区(或考虑更好的测试)。通过显示的有限示例,我认为您必须编写 a = b * c 以确保 ac 不重叠。