用 `Eigen::Matrix` 创建 `alglib::integer_1d_array`
creating `alglib::integer_1d_array` with `Eigen::Matrix`
我一直收到错误 error: no matching function for call to 'alglib::integer_1d_array::setcontent(int, Eigen::PlainObjectBase<Eigen::Matrix<int, 3, 1> >::Scalar*)'
。
出于某种原因 alglib::integer_1d_array
不喜欢以与 alglib::real_1d_array
相同的方式实例化。
例如,在带有模板参数 size_t num
和参数 Eigen::Matrix<double,num,num> A
的函数模板中,这有效:
Eigen::Matrix<double,num,num,Eigen::RowMajor> twice_A_rm(A);
real_2d_array a;
a.setcontent(num, num, twice_A_rm.data());
但是,我一改整型数组就不行了:
Eigen::Matrix<int,num+1,1> ctEig = Eigen::Matrix<int,num+1,1>::Constant(1.0); // positive for >=
integer_1d_array ct;
ct.setlength(num+1);
ct.setcontent(num+1, ctEig.data());
我也可以把最后一行的num+1
换成static_cast<int>(num+1)
,还是不行。我做错了什么?
简单浏览一下 alglib 的源代码,似乎 integer_1d_array
默认具有 ptrdiff_t
类型的数据,也就是说,如果将 int
替换为 ptrdiff_t
在行中你 declare/initialize ctEig
:
Eigen::Matrix<ptrdiff_t,num+1,1> ctEig = Eigen::Matrix<ptrdiff_t,num+1,1>::Constant(1);
integer_1d_array ct;
ct.setlength(num+1); // <-- I assume this line is redundant
ct.setcontent(num+1, ctEig.data());
我一直收到错误 error: no matching function for call to 'alglib::integer_1d_array::setcontent(int, Eigen::PlainObjectBase<Eigen::Matrix<int, 3, 1> >::Scalar*)'
。
出于某种原因 alglib::integer_1d_array
不喜欢以与 alglib::real_1d_array
相同的方式实例化。
例如,在带有模板参数 size_t num
和参数 Eigen::Matrix<double,num,num> A
的函数模板中,这有效:
Eigen::Matrix<double,num,num,Eigen::RowMajor> twice_A_rm(A);
real_2d_array a;
a.setcontent(num, num, twice_A_rm.data());
但是,我一改整型数组就不行了:
Eigen::Matrix<int,num+1,1> ctEig = Eigen::Matrix<int,num+1,1>::Constant(1.0); // positive for >=
integer_1d_array ct;
ct.setlength(num+1);
ct.setcontent(num+1, ctEig.data());
我也可以把最后一行的num+1
换成static_cast<int>(num+1)
,还是不行。我做错了什么?
简单浏览一下 alglib 的源代码,似乎 integer_1d_array
默认具有 ptrdiff_t
类型的数据,也就是说,如果将 int
替换为 ptrdiff_t
在行中你 declare/initialize ctEig
:
Eigen::Matrix<ptrdiff_t,num+1,1> ctEig = Eigen::Matrix<ptrdiff_t,num+1,1>::Constant(1);
integer_1d_array ct;
ct.setlength(num+1); // <-- I assume this line is redundant
ct.setcontent(num+1, ctEig.data());