gpt4 book ai didi

c++ - 具有无别名的特征矩阵 vector 乘法

转载 作者:行者123 更新时间:2023-12-04 12:31:42 38 4
gpt4 key购买 nike

我一直在阅读 Eigen 文档以使用 noalias在做 Matrix-Matrix 产品时避免不必要的临时分配,但我想知道是否可以在以下情况下使用 noalias:

Eigen::VectorXf x(3);
x << 1, 2, 3;

Eigen::MatrixXf A(3, 3);
A << 1, 2, 3, 4, 5, 6, 7, 8, 9;

// Is this valid? Is it valid under certain size assumptions for A and x but not others?
x.noalias() = A * x;
天真地,在这种情况下似乎 noalias 可能是有效的,因为您实际上只需要访问 Matrix 中每列一次的 Vector 元素。
另一方面,x 清楚地出现在表达式的两侧,矩阵乘法涉及各种低级黑魔法,使这种情况难以推理。

最佳答案

testing with Clang trunk and Eigen trunk ,打开优化后, noalias 的情况产生错误的结果。 GCC 主干具有相同的行为。
输出:

Program returned: 0
.noalias
0
0
0
alias
14
32
50

代码:
#include <iostream>
#include <Eigen/Dense>

auto no_alias() -> Eigen::VectorXf
{
Eigen::VectorXf x(3);
x << 1, 2, 3;

Eigen::MatrixXf A(3, 3);
A << 1, 2, 3, 4, 5, 6, 7, 8, 9;

x.noalias() = A * x;
return x;
}

auto alias() -> Eigen::VectorXf
{
Eigen::VectorXf x(3);
x << 1, 2, 3;

Eigen::MatrixXf A(3, 3);
A << 1, 2, 3, 4, 5, 6, 7, 8, 9;

x = A * x;
return x;
}

int main ()
{
std::cout << ".noalias" << std::endl;
for (const auto& no : no_alias())
{
std::cout << no << std::endl;
}

std::cout << "alias" << std::endl;
for (const auto& no : alias())
{
std::cout << no << std::endl;
}
}

关于c++ - 具有无别名的特征矩阵 vector 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65062552/

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