eigen:创建 Vector-like Replicate(使用一个索引访问,LinearAccessBit)
eigen: create Vector-like Replicate (access with one index, LinearAccessBit)
我想创建一个可以像向量一样访问的 Eigen::Replicate
对象,即使用单个索引。我得到它与固定大小 replicate<Index,Index>()
一起工作,我在现实中不能使用它,非一因子不是编译时常量。它在手动创建 Replicate
对象时也有效,但我觉得我只是忽略了使用 replicate
函数实现此目的的明显方法:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main(){
Vector3i v (3);
v << 0,1,2;
constexpr int nReplications {2};
auto replDynamic { v.replicate(nReplications, 1) };
/* with a dynamic replication, two indexes are required to access a coeff */
std::cout << "5th entry: " << replDynamic(4,0) << '\n';
auto replFixed { v.replicate<nReplications, 1>() };
/* I want to use only one index, but I require the number of replications
* in one dimension to be dynamic */
std::cout << "5th entry: " << replFixed(4) << '\n';
/* don't know how to access the VectorwiseOp variant */
// auto replVector { v.replicate(nReplications) };
// std::cout << "5th entry: " << replVector(4) << '\n';
/* this function doesn't exist */
// auto replDefined { v.replicate<Dynamic,1>(nReplications, 1) };
// std::cout << "5th entry: " << replDefined(4) << '\n';
/* I'd rather not define it manually (it's not the intended way), but it works */
Replicate<Vector3i,Dynamic,1> replManual { v, nReplications, 1 };
std::cout << "5th entry: " << replManual(4) << '\n';
return 0;
}
source code在第134行显示VectorwiseOp<...>::replicate(Index factor)
,这听起来是我需要的,但我似乎无法访问它。
并且 replicate<Index,Index>(Index,Index)
等函数不存在。
假设我明白你在问什么,因为 Vector3i
是一列 Eigen::Matrix
,你可以从 Vector3i
中得到一个 VectorwiseOp<...>
表达式模板(比如) 通过使用 colwise()
函数,然后用那个函数调用一个参数 replicate
。
即
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main() {
Vector3i v(3);
v << 0, 1, 2;
auto foo = v.colwise().replicate(2);
std::cout << "5th entry: " << foo(4) << '\n';
return 0;
}
请注意,尽管在表达式模板上使用类型推导,或在 Eigen 文档中称为“伪表达式”,通常是一个坏主意,即编写 Eigen::Matrix<int, 6, 1> foo = v.colwise().replicate(2)
更安全; Eigen 文档提到了问题 here.
通过在 replicate(...)
调用之后添加一个 .reshaped()
,ColsAtCompileTime
被设置为 1,因此,可以像访问向量一样访问结果对象:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main(){
Vector3i v (3);
v << 0,1,2;
constexpr int nReplications {2};
auto replReshaped { v.replicate(nReplications, 1).reshaped() };
std::cout << "5th entry: " << replReshaped(4) << '\n';
return 0;
}
我想创建一个可以像向量一样访问的 Eigen::Replicate
对象,即使用单个索引。我得到它与固定大小 replicate<Index,Index>()
一起工作,我在现实中不能使用它,非一因子不是编译时常量。它在手动创建 Replicate
对象时也有效,但我觉得我只是忽略了使用 replicate
函数实现此目的的明显方法:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main(){
Vector3i v (3);
v << 0,1,2;
constexpr int nReplications {2};
auto replDynamic { v.replicate(nReplications, 1) };
/* with a dynamic replication, two indexes are required to access a coeff */
std::cout << "5th entry: " << replDynamic(4,0) << '\n';
auto replFixed { v.replicate<nReplications, 1>() };
/* I want to use only one index, but I require the number of replications
* in one dimension to be dynamic */
std::cout << "5th entry: " << replFixed(4) << '\n';
/* don't know how to access the VectorwiseOp variant */
// auto replVector { v.replicate(nReplications) };
// std::cout << "5th entry: " << replVector(4) << '\n';
/* this function doesn't exist */
// auto replDefined { v.replicate<Dynamic,1>(nReplications, 1) };
// std::cout << "5th entry: " << replDefined(4) << '\n';
/* I'd rather not define it manually (it's not the intended way), but it works */
Replicate<Vector3i,Dynamic,1> replManual { v, nReplications, 1 };
std::cout << "5th entry: " << replManual(4) << '\n';
return 0;
}
source code在第134行显示VectorwiseOp<...>::replicate(Index factor)
,这听起来是我需要的,但我似乎无法访问它。
并且 replicate<Index,Index>(Index,Index)
等函数不存在。
假设我明白你在问什么,因为 Vector3i
是一列 Eigen::Matrix
,你可以从 Vector3i
中得到一个 VectorwiseOp<...>
表达式模板(比如) 通过使用 colwise()
函数,然后用那个函数调用一个参数 replicate
。
即
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main() {
Vector3i v(3);
v << 0, 1, 2;
auto foo = v.colwise().replicate(2);
std::cout << "5th entry: " << foo(4) << '\n';
return 0;
}
请注意,尽管在表达式模板上使用类型推导,或在 Eigen 文档中称为“伪表达式”,通常是一个坏主意,即编写 Eigen::Matrix<int, 6, 1> foo = v.colwise().replicate(2)
更安全; Eigen 文档提到了问题 here.
通过在 replicate(...)
调用之后添加一个 .reshaped()
,ColsAtCompileTime
被设置为 1,因此,可以像访问向量一样访问结果对象:
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;
int main(){
Vector3i v (3);
v << 0,1,2;
constexpr int nReplications {2};
auto replReshaped { v.replicate(nReplications, 1).reshaped() };
std::cout << "5th entry: " << replReshaped(4) << '\n';
return 0;
}