gpt4 book ai didi

c++ - Eigen是否假设混叠?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:32 24 4
gpt4 key购买 nike

Matrix multiplication is the only operation in Eigen that assumes aliasing by default .

MatrixXf mat1(2,2); 
mat1 << 1, 2, 4, 7;
MatrixXf mat2 = mat1;
auto result = mat1 * mat2;

Eigen 在临时矩阵中计算乘积 mat1 * mat2,然后在计算后用于初始化 result。由于 result 没有出现在右侧,我们不需要别名:

MatrixXf result;
result.noalias() = mat1 * mat2;

现在,乘积 mat1 * mat2 直接计算为 result

到目前为止,还不错。但是在这种情况下会发生什么?

template <typename T1, typename T2>
auto multiplication(const T1& A, const T2& B) // I'm using C++17, decltype not needed
{
return A*B;
}

int main()
{
auto result = multiplication(mat1, mat2); // say mat1 and mat2 are the same as above
// or even this
mat1 = multiplication(mat1, mat2);
return 0;
}

我想说不会出现别名,因为 multiplication(m1,m2) 是一个 rvalue 并且直接在 result 中构造,这要归功于 RVO。我会对行 mat1 = multiplication(mat1, mat2) 说同样的话。 然后我们可以说有一种方法可以将 mat1 与另一个矩阵相乘并存储在不使用临时矩阵的情况下产生相同的矩阵 mat1(因此,避免混叠)。

问题:

Eigen 是否假设这里存在别名或者我的假设是否正确?

最佳答案

您还应该阅读 Common Pitfall关于使用 auto关键字。

如果你写

MatrixXf mat1, mat2;
auto result = mat1 * mat2;

template <typename T1, typename T2>
auto multiplication(const T1& A, const T2& B) { return A*B; }

然后是 auto 的类型实际上就像Product<MatrixXf, MatrixXf>Product<T1,T2> ,即此时根本没有计算发生。

因此

MatrixXf mat1 = MatrixXf::Random(2,2), mat2 = MatrixXf::Random(2,2);

auto result = multiplication(mat1, mat2); // no computation happens here

// this is safe (Eigen assumes aliasing can happen):
mat1 = result; // equivalent to directly assign mat1 = mat1 * mat2;
// Pitfall: "result" now refers to a modified `mat1` object!

// this will give undefined results (you may need bigger matrices to actually see this):
mat1.noalias() = mat1*mat2; // tell Eigen this does not alias, but actually it does.

附录:在注释中指出了赋值和初始化之间的区别。事实上,在初始化期间,Eigen 假设没有发生别名,例如,以下直接分配给结果(没有临时对象):

MatrixXf result = mat1 * mat2; // initialization, not assignment!

附录 2:如果您这样写(假设 foo 的返回类型是 Object ):

Object A;
A = foo(A);

一定有某种隐式赋值发生(如果 Object 允许的话,C++11 可能是移动赋值)。这不同于

Object A;
Object B = foo(A); // RVO possible (depending on foo).

关于c++ - Eigen是否假设混叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57428160/

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