我想按顺序将矩阵A的第0行,第2行和第4行复制到B中.设A = [a0,a1,a2,a3,a4] ^ T,a_i为行向量,则B应为:[a0,a2,a4] ^ T.
下面的代码做我想要的但我想知道是否有更漂亮的解决方案(可能使用Eigen)?
#include <iostream>
#include <vector>
#include <opencv/cv.h>
int main(int argc, char **argv) {
const int num_points = 5;
const int vec_length = 3;
cv::Mat A(num_points, vec_length, CV_32FC1);
cv::RNG rng(0); // Fill A with random values
rng.fill(A, cv::RNG::UNIFORM, 0, 1);
// HACK Ugly way to fill that matrix .
cv::Mat B = cv::Mat(3,vec_length, CV_32FC1);
cv::Mat tmp0 = B(cv::Rect(0,0,vec_length,1));
cv::Mat tmp1 = B(cv::Rect(0,1,vec_length,1));
cv::Mat tmp2 = B(cv::Rect(0,2,vec_length,1));
A.row(0).copyTo(tmp0);
A.row(2).copyTo(tmp1);
A.row(4).copyTo(tmp2);
std::cout << "A: " << …Run Code Online (Sandbox Code Playgroud) 我正在研究一个MATLAB项目,我想用C++和Eigen重新实现计算量最大的部分.我想知道是否有办法执行以下操作(MATLAB语法):
B = A(A < 3);
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉MATLAB的人,上述命令初始化由A中单元格构成的矩阵B,其值小于3.
我从Eigen论坛的帖子中看到,可以通过以下方式获得感兴趣的指数:
MatrixXi indices = (A.array() < 3).cast<int>();
Run Code Online (Sandbox Code Playgroud)
我想拥有的是:
MatrixXd B = A(A.array() < 3);
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在C++中使用Eigen库:我目前正在计算协方差矩阵,如下所示:
Eigen::MatrixXd covariance_matrix = Eigen::MatrixXd::Constant(21, 21, 0);
data mean = calc_mean(all_data)
for(int j = 0; j < 21; j++){
for(int k = 0; k < 21; k++){
for(std::vector<data>::iterator it = all_data.begin(); it!= all_data.end(); it++){
covariance_matrix(j,k) += ((*it)[j] - mean[j]) * ((*it)[k] - mean[k]);
}
covariance_matrix(j,k) /= all_data.size() - 1;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有内置/更优化的方式来使用Eigen库?例如,如果我将数据存储MatrixXd在每行是观察的位置,每列是一个特征?
谢谢
我正在尝试最小化以下示例函数:
F(x) = f[0]^2(x[0],...,x[n-1]) + ... + f[m-1]^2(x[0],...,x[n-1])
Run Code Online (Sandbox Code Playgroud)
最小化这种功能的常用方法可能是Levenberg-Marquardt算法.我想在c ++中执行这种最小化,并且已经使用Eigen进行了一些初步测试,从而得到了预期的解决方案.
我的问题如下:我习惯使用ie在python中进行优化scipy.optimize.fmin_powell.这里的输入函数参数是(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None, direc=None).所以我可以定义一个func(x0),给出x0向量并开始优化.如果需要,我可以更改优化参数.
现在,Eigen Lev-Marq算法以不同的方式工作.我需要定义一个函数向量(为什么?)此外我无法设置优化参数.根据:
http://eigen.tuxfamily.org/dox/unsupported/classEigen_1_1LevenbergMarquardt.html
我应该能够使用setEpsilon()和其他设置函数.
但是当我有以下代码时:
my_functor functor;
Eigen::NumericalDiff<my_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);
lm.setEpsilon(); //doesn't exist!
Run Code Online (Sandbox Code Playgroud)
所以我有两个问题:
为什么需要函数向量,为什么函数标量不够?
我在哪里寻找答案的参考文献:
http://www.ultimatepp.org/reference$Eigen_demo$en-us.html
http://www.alglib.net/optimization/levenbergmarquardt.php
如何使用设置功能设置优化参数?
我的问题是如何初始化一个特征矩阵,但不是这样:
matrix << 1,0,1,0,
1,0,1,0,
1,0,1,0,
Run Code Online (Sandbox Code Playgroud)
我有一个矩阵,看起来像上面的一个(逗号或没有逗号无关紧要)存储在txt文件中.
我已经编写了一个函数来读取每一行并将其放入一个向量中,现在我想用这个数据创建一个矩阵
但它不起作用,我找不到任何解释如何在不编写值的情况下将数据分配给矩阵的页面.(如上例所示)
我需要的只是我的文件中的一个特征矩阵的数据
到目前为止我尝试了什么:(PS:有迭代器的想法,但我想用真正的大矩阵需要太长时间,我只是用1-2维矩阵试过这个例子)
int readFromFile (const char * path, vector <string> & mv)
{
fstream file;
string line;
file.open(path);
while (getline(file,line))
{
mv.push_back(line);
}
file.close();
return 0;
}
typedef Matrix <int, 1, 2> MyMatrix;
int fromVectoEigen (vector<string> & source, MyMatrix & target)
{ //for (int i = source.size(); i<0 ; i--)
//{
string valuerow = source.back();
string::iterator it = valuerow.begin();
target.row(0)<< *it;
target.row(0)<<*it+1;
//source.pop_back();
//}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,只是说Matrix.row(i) …
我正在尝试将Matrix3d旋转转换为a Quaternion<double>,但到目前为止我只得到了奇怪的编译器错误.我正在使用的代码是:
Quaternion<double> getQuaternionFromRotationMatrix(const Matrix3d& mat)
{
AngleAxisd aa;
aa = mat;
Quaternion<double> q = aa;// conversion error
return q;
}
Run Code Online (Sandbox Code Playgroud)
而编译错误:
path/src/Utils.cpp: In function ‘Eigen::Quaternion<double> Utils::getQuaternionFromRotationMatrix(const Matrix3d&)’:
path/src/Utils.cpp:55:26: error: conversion from ‘Eigen::AngleAxisd {aka Eigen::AngleAxis<double>}’ to non-scalar type ‘Eigen::Quaternion<double>’ requested
In file included from /usr/local/include/eigen3/Eigen/Core:283:0,
from /usr/local/include/eigen3/Eigen/Dense:1,
from path/include/Utils.h:4,
from path/src/Utils.cpp:1:
/usr/local/include/eigen3/Eigen/src/Core/Assign.h: In member function ‘Derived& Eigen::DenseBase<Derived>::lazyAssign(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, 3, 1>, Derived = Eigen::Block<Eigen::Matrix<double, 4, 4>, 4, -0x00000000000000001, true, true>]’:
/usr/local/include/eigen3/Eigen/src/Core/Assign.h:534:123: instantiated from ‘static …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来自Eigen 3的Matrix类作为我的状态向量来利用Boost的ODE集成功能,但我遇到了Boost深入的问题,我不明白如何解决.
我正在尝试做的最小例子:
#include <Eigen/Core>
#include <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
#include <iostream>
using namespace Eigen;
using namespace boost::numeric::odeint;
template<size_t N>
using vector = Matrix<double, N, 1>;
typedef vector<3> state;
int main() {
state X0;
X0 << 1., 2., 3.;
state xout = X0;
runge_kutta_dopri5<state> stepper;
// If I remove these lines, everything compiles fine
stepper.do_step([](const state x, state dxdt, const double t) -> void {
dxdt = x;
}, X0, 0.0, xout, 0.01);
std::cout << …Run Code Online (Sandbox Code Playgroud) Eigen是一个c ++线性代数库http://eigen.tuxfamily.org.
使用基本数据类型(如基本浮点数组)很容易,只需将其复制到设备内存并将指针传递给cuda内核即可.但是Eigen矩阵是复杂的类型,那么如何将其复制到设备内存并让cuda内核用它进行读/写?
我有一个描述地面集的矩阵NxM(通常是10k X 10k元素).每行代表一个对象,每列代表一个特定的特征.例如,在矩阵中
f1 f2 f3
x1 0 4 -1
x2 1 0 5
x3 4 0 0
x4 0 1 0
Run Code Online (Sandbox Code Playgroud)
对象x1在特征1中具有值0,在特征1中具有值4,在特征-1中具有值0.这个值是一般实数(double's).
我必须计算所有对象(所有对线)之间的几个自定义距离/不相似度.为了比较,我想计算L1(曼哈顿)和L2(欧几里德)距离.
我使用Eigen库来执行我的大部分计算.为了计算L2(欧几里得),我使用以下观察:对于两个大小为n的向量a和b,我们有:
||a - b||^2 = (a_1 - b_1)^2 + (a_2 - b_2)^2 + ... +(a_n - b_n)^2
= a_1^2 + b_1^2 - 2 a_1 b_1 + a_2^2 + b_2^2 - 2 a_2 b_2 + ... + a_n^2 + b_n^2 - 2 a_n b_n
= a . a + b . … 以下代码在 c++17 模式下使用 clang-trunk 编译得很好,但在 c++2a(即将推出的 c++20)模式下会中断:
// Meta struct describing the result of a comparison
struct Meta {};
struct Foo {
Meta operator==(const Foo&) {return Meta{};}
Meta operator!=(const Foo&) {return Meta{};}
};
int main()
{
Meta res = (Foo{} != Foo{});
}
Run Code Online (Sandbox Code Playgroud)
使用 gcc-trunk 或 clang-9.0.0 也可以很好地编译:https : //godbolt.org/z/8GGT78
clang-trunk 的错误和-std=c++2a:
<source>:12:19: error: use of overloaded operator '!=' is ambiguous (with operand types 'Foo' and 'Foo')
Meta res = (f != g);
~ ^ ~
<source>:6:10: …Run Code Online (Sandbox Code Playgroud)