当前位置: 首页 > 知识库问答 >
问题:

消除中间本征阵列

宰父深
2023-03-14

Eigen是否制作任何中间数组来计算x或Eigen只是将值放入simd寄存器并进行计算?

一般来说,如何知道Eigen制造了多少中间体?

循环的每一个周期中,Eigen会为中间产物分配新的内存吗?

是否有任何方法可以确保eigen不会产生任何中间产物?它是否有一个类似于“EIGEN_NO_INTERMEDIATE”的宏?

#include <Eigen/Eigen>
#include <iostream>

using namespace Eigen;

template<typename T>
void fill(T& x) {
    for (int i = 0; i < x.size(); ++i) x.data()[i] = i + 1;
}

int main() {
    int n = 10;  // n is actually about 400
    ArrayXXf x(n, n);
    ArrayXf y(n);
    fill(x);
    fill(y);
    for (int i = 0; i < 10; ++i) {  // many cycles
        x = x * ((x.colwise() / y).rowwise() / y.transpose()).exp();
    }
    std::cout << x << "\n";
}

共有1个答案

东方高洁
2023-03-14

您可以将钩子添加到DenseStorage构造函数中,如下所示:

#include <iostream>

static long int nb_temporaries;
inline void on_temporary_creation(long int size) {
  if(size!=0) nb_temporaries++;
}

// must be defined before including any Eigen header!
#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { on_temporary_creation(size); }

#define VERIFY_EVALUATION_COUNT(XPR,N) {\
    nb_temporaries = 0; \
    XPR; \
    if(nb_temporaries!=N) { std::cerr << "nb_temporaries == " << nb_temporaries << "\n"; }\
  }

#include <Eigen/Core>
using namespace Eigen;

template<typename T>
void fill(T& x) { for(int i=0; i<x.size(); ++i) x(i)= i+1; }

int main() {
    int n=10;
    ArrayXXf x(n,n); fill(x);
    ArrayXf y(n); fill(y);

    for(int i=0; i<10; ++i)
    {
        VERIFY_EVALUATION_COUNT( x = x * ((x.colwise()/y).rowwise()/y.transpose()).exp(), 0);
    }
    std::cout << x << '\n';
}

本质上,这就是Eigen在其testsuite中的某些部分所做的工作:参见此处了解testsuite中的原始定义,以及此处了解testsuite中的示例用法。

或者,如果您只关心中间内存分配,可以尝试使用宏EIGEN\u RUNTIME\u NO\u MALLOC——这将允许固定大小的表达式计算为临时表达式,因为它们只在堆栈上分配。

 类似资料:
  • 向源生成特殊的clear-message,这将导致聚合的消息变为空 将消息直接写入具有空数据的中间主题 另一种方式,也许kafka-streams已经有一个API调用了? 加分问题:如果我知道我不想让消息坐在中间话题中的时间超过6个月,我可以指示kafka-streams创建6M留存的中间话题,还是在我运行App之前我自己手动创建话题?

  • $format = new \Vtiful\Kernel\Format($fileHandle); $style = $format->strikeout()->toResource();

  • 本文向大家介绍C++ Eigen库计算矩阵特征值及特征向量,包括了C++ Eigen库计算矩阵特征值及特征向量的使用技巧和注意事项,需要的朋友参考一下 本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。 C++Eigen库代码 计算结果: 最大最小特征值及其索引位置 Matlab 代码 Matlab计算结果 使用sort()函数对特征值排序 主成份分析以及许多

  • 准备面试。试图找出一个解决方案的问题"最快的方法来消除连续重复数组"使用客观C.i. e输入=[1,2,2,1,2,3,3,4]输出=[1,2,1,2,3,4] > 对于数组内方法:循环数组中的元素,若元素==上一个元素,则移除它并重新调整所有其他元素以向下移动。 对于我们可以使用另一个数组的方法。如果element==上一个元素,不要将其添加到新的“唯一数组”,否则将其添加到唯一数组。 有没有更

  • 我使用Stanford NLP文本分类器(ColumnDataClassifier)从我的Java代码。我有两个主要问题。

  • 本文向大家介绍如何在Python中使用scikit-learn库从特征向量中消除均值?,包括了如何在Python中使用scikit-learn库从特征向量中消除均值?的使用技巧和注意事项,需要的朋友参考一下 预处理数据是指清除数据,删除无效数据,噪声,用相关值替换数据等。 数据预处理基本上是指将所有数据(从各种资源或单个资源收集的数据)收集为通用格式或统一数据集(取决于数据类型)的任务。一步的输出