小编Cal*_*ior的帖子

为什么Eigens mean()方法比sum()快得多?

这是一个相当理论上的问题,但我对它很感兴趣,并且如果有人对他或她愿意分享的一些专业知识感到高兴.

我有一个具有2000行和600列的浮点矩阵,并希望从每行中减去列的平均值.我测试了以下两行并比较了它们的运行时间:

MatrixXf centered = data.rowwise() - (data.colwise().sum() / data.cols());
MatrixXf centered = data.rowwise() - data.colwise().mean();
Run Code Online (Sandbox Code Playgroud)

我想,mean()除了将每列的总和除以行数之外不会做一些不同的事情,但是当我的计算机上第一行的执行需要12.3秒时,第二行在0.09秒内完成.

我正在使用Eigen version 3.2.6,目前是最新版本,我的矩阵按行主要顺序存储.

有人知道一些内部因素Eigen可以解释这种巨大的性能差异吗?


编辑:我应该补充说data,上面的代码实际上是类型,Eigen::Map< Eigen::MatrixXf<Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> >并将Eigen的功能映射到原始缓冲区.


编辑2:根据GuyGreer的建议,我将提供一些示例代码来重现我的发现:

#include <iostream>
#include <chrono>
#include <Eigen/Core>
using namespace std;
using namespace std::chrono;
using namespace Eigen;

int main(int argc, char * argv[])
{
    MatrixXf data(10000, 1000), centered;
    data.setRandom();
    auto start = high_resolution_clock::now();
    if (argc > 1)
        centered = data.rowwise() - data.colwise().mean();
    else …
Run Code Online (Sandbox Code Playgroud)

c++ eigen

11
推荐指数
1
解决办法
405
查看次数

为什么Eigen的Cholesky分解在Linux上比Windows上快得多?

我注意到使用Eigen库进行Cholesky分解时,性能存在显着差异。

我正在使用具有以下基准代码的最新版本的Eigen(3.2.1):

#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;

int main()
{
    const MatrixXd::Index size = 4200;
    MatrixXd m = MatrixXd::Random(size, size);
    m = (m + m.transpose()) / 2.0 + 10000 * MatrixXd::Identity(size, size);

    LLT<MatrixXd> llt;
    auto start = high_resolution_clock::now();
    llt.compute(m);
    if (llt.info() != Success)
        cout << "Cholesky decomposition failed!" << endl;
    auto stop = high_resolution_clock::now();

    cout << "Cholesky decomposition in "
         << duration_cast<milliseconds>(stop - start).count()
         << " …
Run Code Online (Sandbox Code Playgroud)

c++ linux performance eigen

5
推荐指数
1
解决办法
1728
查看次数

什么可能导致 liblinear 达到最大迭代次数?

我将liblinear与我的程序一起使用,以通过L2R_L2LOSS_SVC_DUAL求解器执行多类分类。在当前的测试设置中,我有来自总共 9 个类的 1600 个实例,每个类有 1000 个特征。

我正在尝试通过 5 倍交叉验证确定用于训练的最佳 C 参数,但即使使用 1.0 liblinear 的小 C 也能达到最大迭代次数:

................................................................................
....................
optimization finished, #iter = 1000

WARNING: reaching max number of iterations
Using -s 2 may be faster (also see FAQ)

Objective value = -637.100923
nSV = 783
Run Code Online (Sandbox Code Playgroud)

FAQ网站提到了这两个可能的原因:

  1. 数据未缩放。
  2. 使用了一个大的 C 参数。
  3. 使用了大量具有少量特征的实例,因此求解器L2R_L2LOSS_SVC可能会更快。

没有一个适用于我的情况。因为我的特征向量是某种直方图,所以有一个自然最大值,我用它来将特征缩放到 [0,1]。

我为 liblinear 设置了参数,如下所示:

struct parameter svmParams;
svmParams.solver_type = L2R_L2LOSS_SVC_DUAL;
svmParams.eps = 0.1;
svmParams.nr_weight = 0;
svmParams.weight_label = NULL; …
Run Code Online (Sandbox Code Playgroud)

c classification machine-learning liblinear

5
推荐指数
0
解决办法
1401
查看次数

Python 导入失败并显示“dlopen:无法使用静态 TLS 加载更多对象”

我编写了一个调用的多线程模块fast_nnCython并使用以下内容编译它setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy

setup(
    ext_modules = cythonize([
        Extension("fast_nn", ["fast_nn.pyx"], language = 'c++', extra_compile_args = ['-O3', '-fopenmp'], extra_link_args = ['-fopenmp'], include_dirs = [numpy.get_include()])
    ])
)
Run Code Online (Sandbox Code Playgroud)

另外,我使用了caffe框架的python 绑定。

如果我单独或pycaffe单独使用我的模块,一切都很好。但是,以下组合是有问题的:

import caffe.io
import fast_nn
Run Code Online (Sandbox Code Playgroud)

在一台机器上,它不会导致任何问题。在另一台机器上,我收到以下异常:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    import fast_nn
ImportError: dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)

这个线程我了解到有太多带有初始执行静态 …

python cython dlopen pycaffe

5
推荐指数
0
解决办法
2228
查看次数

在python中计算RBF内核的最快方法是什么?

我想为X具有n行和d列的数据矩阵计算RBF或"高斯"内核.得到的方形核矩阵由下式给出:

K[i,j] = var * exp(-gamma * ||X[i] - X[j]||^2)
Run Code Online (Sandbox Code Playgroud)

var并且gamma是标量.

在python中执行此操作的最快方法是什么?

python numpy

5
推荐指数
2
解决办法
6284
查看次数

本征 LDLT 比 LLT 慢?

我正在使用 Eigen 3 的 Cholesky 模块来求解线性方程组。Eigen 文档指出,为此目的使用LDLT而不是LLT会更快,但我的基准测试显示了不同的结果。

我使用以下代码进行基准测试:

#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;

int main()
{
    MatrixXf cov = MatrixXf::Random(4200, 4200);
    cov = (cov + cov.transpose()) + 1000 * MatrixXf::Identity(4200, 4200);
    VectorXf b = VectorXf::Random(4200), r1, r2;

    r1 = b;
    LLT<MatrixXf> llt;
    auto start = high_resolution_clock::now();
    llt.compute(cov);
    if (llt.info() != Success)
    {
        cout << "Error on LLT!" << endl;
        return 1;
    }
    auto middle …
Run Code Online (Sandbox Code Playgroud)

c++ eigen

3
推荐指数
1
解决办法
3695
查看次数