在 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
以确保 a
和 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
以确保 a
和 c
不重叠。