标签: eigen

eigen::select() 的奇怪行为

在本征中,构造:

(R.array() < s).select(P,Q); 
Run Code Online (Sandbox Code Playgroud)

当 P、Q 中的一个或两个是向量(与 R 的长度相同)时有效。但是一旦它们都是标量,我就会收到编译错误。

我的问题是;select存在两个标量时的行为是特征警告我有更有效构造的一种方式吗?如果有,它们是什么?

c++ eigen

0
推荐指数
1
解决办法
827
查看次数

如何获取数组的基数为 10 的日志?

我想获取Eigen::Array.

为了获得自然对数,我只是array.log()按照文档:http : //eigen.tuxfamily.org/dox/classEigen_1_1Array.html

但我没有看到提到 base-10 日志。当然有一种方法可以在不写我自己的情况下做到这一点?

目前我正在做一些array.unaryExpr(std::ptr_fun(std::log10))似乎工作正常的事情,但我希望在不影响性能的情况下更整洁。

c++ eigen

0
推荐指数
1
解决办法
1301
查看次数

使用初始化列表作为参数时的歧义

我对以下代码感到困惑:

#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)

c++ initializer-list eigen c++11

0
推荐指数
1
解决办法
1349
查看次数

是否可以为 C++ 构建特征库而不是使用预构建的文件?

我正在使用从网站下载的预先构建的 3.2.5 Eigen lib 文件:http ://eigen.tuxfamily.org/index.php?title= Main_Page

我听说如果我自己在我的 PC 上构建文件,我可以实现与我的处理器更高的兼容性,这会导致 lib 的性能略有提高。目前我正在为 eigensolver 计算时间太长而苦苦挣扎。

我使用 Visual Studio 2005,我只是将 Eigen 文件位置添加到我的项目属性链接器中。

有没有办法在我的平台上自己构建这些文件?我有点困惑我该怎么做。它与CMake有关吗?

c++ eigen

0
推荐指数
1
解决办法
1460
查看次数

使用循环用数字填充矩阵 A(Eigen::Matrix2d A)

每当我尝试这段代码时,我都会得到一个断言失败!如何使用循环填充矩阵 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)

c++ eigen eigen3

0
推荐指数
1
解决办法
2699
查看次数

特征在矩阵加法中丢失负号

我试图使用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)

c++ matlab eigen

0
推荐指数
1
解决办法
98
查看次数

用本征求解小型齐次线性系统的最快方法

我需要解决许多形式为 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)

有没有更快的方法来做到这一点?

c++ linear-algebra eigen

0
推荐指数
1
解决办法
992
查看次数

特征 - .cwiseProduct 的返回类型?

我正在 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)

rcpp eigen

0
推荐指数
1
解决办法
1498
查看次数

为什么我不能在Eigen3中消除这个临时变量?

我通过逐个矩阵乘法遇到了麻烦.即一个看起来很像的表达式总是返回一个接近[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)

c++ eigen eigen3

0
推荐指数
1
解决办法
76
查看次数

特征范围初始化

我正在尝试使用 Eigen3 生成一个 2d 浮点矩阵,(num_samples, num_ranges)这样每一列都是与[0, num_samples)like的连续间隔范围[0, 1, 2 ... num_samples - 1]

我目前正在通过创建一个类似的 2d std::vectorwithstd::iota然后将其转换为 Eigen 2d 矩阵来实现这一点。

在 Eigen 中有更快更简单的方法吗?

eigen c++11 eigen3

0
推荐指数
1
解决办法
1266
查看次数

标签 统计

eigen ×10

c++ ×8

eigen3 ×3

c++11 ×2

initializer-list ×1

linear-algebra ×1

matlab ×1

rcpp ×1