gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:06:26 25 4
gpt4 key购买 nike

假设有三个矩阵a,b,ca 和 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 不重叠。

关于c++ - 在 Eigen(c++) 中使用 noalias 之前是否需要检查指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32292971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com