gpt4 book ai didi

c++ - 对 Matrix<> 或 Block<> 进行数组运算的特征函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:56:19 25 4
gpt4 key购买 nike

我想制作一个可以接受 Matrix<> 或 Block<> 对象的函数。

例子:

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

//A simplified example of the function I'm making
double example_function(const Eigen::MatrixXd & input){
double d1 = input.array().pow(2).sum();
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}


int main(){
Eigen::MatrixXd m1(3,2);
m1.setRandom();

// This works
example_function(m1);

// I'd like to make this work
example_function(m1.block(1,0,2,2));

return 0;
}

以下不工作,因为 DenseBase 没有 'array' 方法:

template<typename Derived>
double example_function(const Eigen::DenseBase<Derived> & input){
double d1 = input.array().pow(2).sum(); // array() method invalid
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}

我该怎么做?

最佳答案

首先,您的原始代码(带有 const MatrixXd& )确实有效,但它会生成不必要的拷贝。同时接受 Matrix<...>Block<Matrix<...> >通过模板函数对象,使用 MatrixBase而不是 DenseBase :

template<class Derived>
double example_function(const Eigen::MatrixBase<Derived> & input){
double d1 = input.array().abs2().sum(); // abs2() is simpler/more efficient than pow(2)
double d2 = input.rowwise().norm().sum();
return d1 + d2;
}

但是,在您的示例代码中 m1.block(1,0)无效,因为您需要指定大小和起始索引,例如,这些工作:

m1.block<1,2>(1,0);
m1.block(1,0, 1,2);

m1.Random()应该是 m1.setRandom() .

关于c++ - 对 Matrix<> 或 Block<> 进行数组运算的特征函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079785/

25 4 0
文章推荐: jquery - 将不同的样式表动态应用到布局中
文章推荐: javascript - 将字符串中的末尾括号替换为反斜杠字符,后跟末尾括号
文章推荐: jquery -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com