在本征中,构造:
(R.array() < s).select(P,Q);
Run Code Online (Sandbox Code Playgroud)
当 P、Q 中的一个或两个是向量(与 R 的长度相同)时有效。但是一旦它们都是标量,我就会收到编译错误。
我的问题是;select存在两个标量时的行为是特征警告我有更有效构造的一种方式吗?如果有,它们是什么?
我想获取Eigen::Array.
为了获得自然对数,我只是array.log()按照文档:http : //eigen.tuxfamily.org/dox/classEigen_1_1Array.html
但我没有看到提到 base-10 日志。当然有一种方法可以在不写我自己的情况下做到这一点?
目前我正在做一些array.unaryExpr(std::ptr_fun(std::log10))似乎工作正常的事情,但我希望在不影响性能的情况下更整洁。
我对以下代码感到困惑:
#include <Eigen/Dense>
#include <vector>
class Foo {};
void f(Eigen::MatrixXd const &) {}
void f(std::vector<Eigen::MatrixXd> const &) {}
void g(Foo const &) {}
void g(std::vector<Foo> const &) {}
int main()
{
Foo a, b, c;
Eigen::MatrixXd x, y, z;
// f({x, y}); ambiguity, why?!
f({x, y, z}); // ok
g({a,b}); // ok
g({a,b,c}); // ok
}
Run Code Online (Sandbox Code Playgroud)
如果我取消注释中的第 3 行代码main(),我会收到一个模棱两可的调用错误,
/Users/vlad/so.cpp: In function 'int main()':
/Users/vlad/so.cpp:17:13: error: call of overloaded 'f(<brace-enclosed initializer list>)' is ambiguous
f({x, y}); //ambiguity, why?! …Run Code Online (Sandbox Code Playgroud) 每当我尝试这段代码时,我都会得到一个断言失败!如何使用循环填充矩阵 A ?
#include <iostream>
#include "../eigen3/Eigen/Dense"
int main ()
{
Eigen::Matrix2d A;
for (int row = 0; row < 5; ++row)
{
for (int col = 0; col < 5; ++col)
{
// A(row,col)=10; // ???
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图使用Eigen库添加一个矩阵,我的结果在数值上可以,但它缺少负号.添加后的结果更正是失去负号的最终添加.所有矩阵都声明为double.
我在这两种情况下都有这个代码:
for(int i=0;i<9;i++){
mata<<MatrixXd::Zero(4,4);
for(int j=0;i<4;j++){
mata += matb.transpose()*(matc*matb)*scalar;
}
cout<<mata<<endl;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
for(int i=0;i<9;i++){
mata<<MatrixXd::Zero(4,4);
for(int j=0;i<4;j++){
MatrixXd aux=matb.transpose();
MatrixXd aux2=(matc*matb)*scalar
mata += aux*aux2;
}
cout<<mata<<endl;
}
Run Code Online (Sandbox Code Playgroud)
Matlab结果:
1.92186 -0.960928 -0.960928 -5.55112e-17
-0.960928 1.92186 -5.55112e-17 -0.960928
-0.960928 -5.55112e-17 1.92186 -0.960928
-5.55112e-17 -0.960928 -0.960928 1.92186
Run Code Online (Sandbox Code Playgroud)
特征结果:
1.92186 -0.960928 -0.960928 5.55112e-17
-0.960928 1.92186 5.55112e-17 -0.960928
-0.960928 5.55112e-17 1.92186 -0.960928
5.55112e-17 -0.960928 -0.960928 1.92186
Run Code Online (Sandbox Code Playgroud) 我需要解决许多形式为 Ax=0 的小 (n=4) 齐次线性系统,其中 A 是奇异矩阵。我目前正在使用以下代码:
void solve(const matrix_t& A, vector_t& x){
auto svd = A.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV);
auto V = svd.matrixV();
x = V.col( A.rows() - 1 );
x.normalize();
}
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来做到这一点?
我正在 RcppEigen 中编写一个用于加权协方差的函数。在其中一个步骤中,我想获取矩阵 X 的第 i 列和第 j 列,并计算应该返回某种向量的 cwiseProduct。cwiseProduct 的输出将进入一个可以多次重复使用的中间变量。从文档看来,cwiseProduct返回一个CwiseBinaryOp,它本身有两种类型。我的 cwiseProduct 对两个列向量进行操作,所以我认为正确的返回类型应该是Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr>,但是我收到错误no member named ColXpr in namespace Eigen
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
Rcpp::List Crossprod_sparse(Eigen::MappedSparseMatrix<double> X, Eigen::Map<Eigen::MatrixXd> W) {
int K = W.cols();
int p = X.cols();
Rcpp::List crossprods(W.cols());
for (int i = 0; i < p; i++) {
for (int j = i; j < p; j++) {
Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr> prod = X.col(i).cwiseProduct(X.col(j));
for (int k = 0; k < K; …Run Code Online (Sandbox Code Playgroud) 我通过逐个矩阵乘法遇到了麻烦.即一个看起来很像的表达式总是返回一个接近[1 0]的向量,而一个看起来相似的表达式返回正确的结果:
// version WITH temp var, correct
Eigen::Vector3d lcoord_eig(lcoord[0], lcoord[1], lcoord[2]);
auto lcoord2d = P3to2 * lcoord_eig;
std::cout << std::endl << lcoord2d << std::endl;
// version WITHOUT temp var, always [1 0]
auto lcoord2d_2 = P3to2 * Eigen::Vector3d(lcoord[0], lcoord[1], lcoord[2]);
std::cout << std::endl << lcoord2d_2 << std::endl;
Run Code Online (Sandbox Code Playgroud)
where P3to2是2乘3矩阵(Eigen::MatrixXd)并且lcoord是其他库的3d矢量类型,上面的代码包含在for循环中.
一些输出(由我注释):
-0.0036135
2.1684e-18 // correct
1
0 // [1 0], wrong
0.00209583
0.000388139 // correct
1
5.55112e-17 // [1 0], wrong
0.00148429
-0.000435008 // correct …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Eigen3 生成一个 2d 浮点矩阵,(num_samples, num_ranges)这样每一列都是与[0, num_samples)like的连续间隔范围[0, 1, 2 ... num_samples - 1]。
我目前正在通过创建一个类似的 2d std::vectorwithstd::iota然后将其转换为 Eigen 2d 矩阵来实现这一点。
在 Eigen 中有更快更简单的方法吗?