- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试设置自定义标量类型以用于Eigen3库(自动柜员机是double
的简单包装)。据我所知,我一直按照https://eigen.tuxfamily.org/dox/TopicCustomizing_CustomScalar.html进行操作,并且基本操作正常。
我需要使用自定义类型来解决矩阵的特征值问题,而这正是事情开始崩溃的地方。我的编译器向我吐出以下错误消息:
/Eigen3/Eigen/src/Householder/Householder.h:131:18: error: no viable overloaded '-='
this->row(0) -= tau * tmp;
~~~~~~~~~~~~ ^ ~~~~~~~~~
/Eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h:314:10: note: in instantiation of function template specialization 'Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<MyDouble, 2,
2, 0, 2, 2>, -1, -1, false> >::applyHouseholderOnTheLeft<Eigen::VectorBlock<Eigen::Block<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>, 2, 1, true>, -1> >' requested here
.applyHouseholderOnTheLeft(matA.col(i).tail(remainingSize-1), h, &temp.coeffRef(0));
^
/Eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h:161:7: note: in instantiation of member function 'Eigen::HessenbergDecomposition<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>
>::_compute' requested here
_compute(m_matrix, m_hCoeffs, m_temp);
^
/Eigen3/Eigen/src/Eigenvalues/./RealSchur.h:271:10: note: in instantiation of function template specialization 'Eigen::HessenbergDecomposition<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>
>::compute<Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<MyDouble, MyDouble>, const Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<MyDouble>, const
Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2> > > >' requested here
m_hess.compute(matrix.derived()/scale);
^
/Eigen3/Eigen/src/Eigenvalues/EigenSolver.h:389:15: note: in instantiation of function template specialization 'Eigen::RealSchur<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>
>::compute<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2> >' requested here
m_realSchur.compute(matrix.derived(), computeEigenvectors);
^
/Eigen3/Eigen/src/Eigenvalues/EigenSolver.h:156:7: note: in instantiation of function template specialization 'Eigen::EigenSolver<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2>
>::compute<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2> >' requested here
compute(matrix.derived(), computeEigenvectors);
^
/home/adam/Documents/Git/spin_phonon_coupling/src/test.cpp:205:52: note: in instantiation of function template specialization 'Eigen::EigenSolver<Eigen::Matrix<MyDouble, 2, 2, 0, 2, 2> >::EigenSolver<Eigen::Matrix<MyDouble, 2, 2, 0, 2,
2> >' requested here
Eigen::EigenSolver<Eigen::Matrix<MyDouble, 2, 2>> solver(test);
^
/Eigen3/Eigen/src/Core/DenseBase.h:298:14: note: candidate template ignored: could not match 'EigenBase<type-parameter-0-0>' against 'MyDouble'
Derived& operator-=(const EigenBase<OtherDerived> &other);
^
/Eigen3/Eigen/src/Core/MatrixBase.h:161:14: note: candidate template ignored: could not match 'MatrixBase<type-parameter-0-0>' against 'MyDouble'
Derived& operator-=(const MatrixBase<OtherDerived>& other);
^
/Eigen3/Eigen/src/Core/MatrixBase.h:495:46: note: candidate template ignored: could not match 'ArrayBase<type-parameter-0-0>' against 'MyDouble'
template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )
-=
运算符,基本问题似乎是缺少的重载。问题是我不知道为什么。据我所知,我已经为我的类型定义了重载运算符,但是如果我正确理解错误,似乎内部特征值类型缺少重载...
#include <iostream>
#include <cmath>
#include <Eigen/Dense>
class MyDouble {
public:
double value;
MyDouble() : value() {};
MyDouble(double val) : value(val) {};
template<typename T>
MyDouble operator+(T other) const {
return value + other;
}
template<>
MyDouble operator+(MyDouble other) const {
return MyDouble(value + other.value);
}
template<typename T>
MyDouble operator-(T other) const {
return value - other;
}
template<>
MyDouble operator-(MyDouble other) const {
return MyDouble(value - other.value);
}
template<typename T>
MyDouble operator*(T other) const {
return value * other;
}
template<>
MyDouble operator*(MyDouble other) const {
return MyDouble(value * other.value);
}
template<typename T>
MyDouble operator/(T other) const {
return value / other;
}
template<>
MyDouble operator/(MyDouble other) const {
return MyDouble(value / other.value);
}
template<typename T>
MyDouble& operator+=(T other) {
value += other;
return *this;
}
template<>
MyDouble& operator+=(MyDouble other) {
value += other.value;
return *this;
}
template<typename T>
MyDouble& operator-=(const T &other) {
value -= other;
return *this;
}
template<>
MyDouble& operator-=(const MyDouble &other) {
value -= other.value;
return *this;
}
template<typename T>
MyDouble& operator*=(T other) {
value *= other.value;
return *this;
}
template<>
MyDouble& operator*=(MyDouble other) {
value *= other.value;
return *this;
}
template<typename T>
MyDouble& operator/=(T other) {
value /= other;
return *this;
}
template<>
MyDouble& operator/=(MyDouble other) {
value /= other.value;
return *this;
}
MyDouble operator-() const {
return -value;
}
template<typename T>
bool operator<(T other) const {
return value < other;
}
template<>
bool operator<(MyDouble other) const {
return value < other.value;
}
template<typename T>
bool operator>(T other) const {
return value > other;
}
template<>
bool operator>(MyDouble other) const {
return value > other.value;
}
template<typename T>
bool operator<=(T other) const {
return value <= other;
}
template<>
bool operator <=(MyDouble other) const {
return value <= other.value;
}
template<typename T>
bool operator>=(T other) const {
return value >= other;
}
template<>
bool operator>=(MyDouble other) const {
return value >= other.value;
}
template<typename T>
bool operator==(T other) const {
return value == other;
}
template<>
bool operator==(MyDouble other) const {
return value == other.value;
}
template<typename T>
bool operator!=(T other) const {
return value != other;
}
template<>
bool operator!=(MyDouble other) const {
return value != other.value;
}
friend std::ostream& operator<<(std::ostream& out, const MyDouble& val) {
out << val.value << " m";
return out;
}
operator double() {
return value;
}
};
MyDouble sqrt(MyDouble val) {
return std::sqrt(val.value);
}
MyDouble abs(MyDouble val) {
return std::abs(val.value);
}
MyDouble abs2(MyDouble val) {
return val * val;
}
namespace Eigen {
template<> struct NumTraits<MyDouble>
: NumTraits<double> // permits to get the epsilon, dummy_precision, lowest, highest functions
{
typedef MyDouble Real;
typedef MyDouble NonInteger;
typedef MyDouble Nested;
enum {
IsComplex = 0,
IsInteger = 0,
IsSigned = 1,
RequireInitialization = 1,
ReadCost = 1,
AddCost = 3,
MulCost = 3
};
};
template<typename BinaryOp>
struct ScalarBinaryOpTraits<MyDouble,double,BinaryOp> { typedef MyDouble ReturnType; };
template<typename BinaryOp>
struct ScalarBinaryOpTraits<double,MyDouble,BinaryOp> { typedef MyDouble ReturnType; };
}
int main() {
Eigen::Matrix<MyDouble, 2, 2> test;
test << 1, 2, 3, 4;
Eigen::Matrix<double, 2, 2> test2;
test2 << 5, 6, 7, 8;
MyDouble a = 3;
a -= 2;
a -= MyDouble(3);
Eigen::EigenSolver<Eigen::Matrix<MyDouble, 2, 2>> solver(test);
std::cout << test.trace() << std::endl;
std::cout << solver.eigenvalues() << std::endl;
}
最佳答案
马克·格里斯(Marc Glisse)指出,我的运算符重载似乎有些奇怪,因此我重写了它们,而最初的问题就消失了。我不知道为什么是这种情况。
然后我只有一个问题,就是我的自定义类型未定义Eigen的isfinite
函数,因此我继续添加了它的实现(尽管我不确定那是否确实是可靠的)。
无论如何,我的代码现在可以编译。这是我的代码的修改后的版本:
#include <iostream>
#include <cmath>
#include <complex>
#include <Eigen/Dense>
class MyDouble {
public:
double value;
MyDouble() : value() {};
MyDouble(double val) : value(val) {};
template<typename T>
MyDouble& operator+=(T rhs) {
value = static_cast<double>(value + rhs);
return *this;
}
template<typename T>
MyDouble& operator-=(const T &rhs) {
value = static_cast<double>(value - rhs);
return *this;
}
template<typename T>
MyDouble& operator*=(T rhs) {
value = static_cast<double>(value * rhs);
return *this;
}
template<typename T>
MyDouble& operator/=(T rhs) {
value = static_cast<double>(value / rhs);
return *this;
}
MyDouble operator-() const {
return -value;
}
friend std::ostream& operator<<(std::ostream& out, const MyDouble& val) {
out << val.value << " m";
return out;
}
explicit operator double() {
return value;
}
};
#define OVERLOAD_OPERATOR(op,ret) ret operator op(const MyDouble &lhs, const MyDouble &rhs) { \
return lhs.value op rhs.value; \
}
OVERLOAD_OPERATOR(+, MyDouble)
OVERLOAD_OPERATOR(-, MyDouble)
OVERLOAD_OPERATOR(*, MyDouble)
OVERLOAD_OPERATOR(/, MyDouble)
OVERLOAD_OPERATOR(>, bool)
OVERLOAD_OPERATOR(<, bool)
OVERLOAD_OPERATOR(>=, bool)
OVERLOAD_OPERATOR(<=, bool)
OVERLOAD_OPERATOR(==, bool)
OVERLOAD_OPERATOR(!=, bool)
MyDouble sqrt(MyDouble val) {
return std::sqrt(val.value);
}
MyDouble abs(MyDouble val) {
return std::abs(val.value);
}
MyDouble abs2(MyDouble val) {
return val * val;
}
bool isfinite(const MyDouble &) { return true; }
namespace Eigen {
template<> struct NumTraits<MyDouble>
: NumTraits<double> // permits to get the epsilon, dummy_precision, lowest, highest functions
{
typedef MyDouble Real;
typedef MyDouble NonInteger;
typedef MyDouble Nested;
enum {
IsComplex = 0,
IsInteger = 0,
IsSigned = 1,
RequireInitialization = 0,
ReadCost = 1,
AddCost = 3,
MulCost = 3
};
};
template<typename BinaryOp>
struct ScalarBinaryOpTraits<MyDouble,double,BinaryOp> { typedef MyDouble ReturnType; };
template<typename BinaryOp>
struct ScalarBinaryOpTraits<double,MyDouble,BinaryOp> { typedef MyDouble ReturnType; };
}
int main() {
Eigen::Matrix<MyDouble, 2, 2> test;
test << 1, 2, 3, 4;
Eigen::Matrix<double, 2, 2> reference;
reference << 1, 2, 3, 4;
MyDouble a = 3;
a += 2;
a = 2 + a;
a = a + 2;
a -= 2;
a -= MyDouble(3);
a = a / a;
std::complex<MyDouble> complexTest(3,4);
complexTest *= 2;
Eigen::EigenSolver<Eigen::Matrix<MyDouble, 2, 2>> solver(test);
Eigen::EigenSolver<Eigen::Matrix<double, 2, 2>> refSolver(reference);
std::cout << "MyDouble:" << std::endl;
std::cout << test.trace() << std::endl;
std::cout << solver.eigenvalues() << std::endl;
std::cout << "\nRefernce:" << std::endl;
std::cout << reference.trace() << std::endl;
std::cout << refSolver.eigenvalues() << std::endl;
}
关于c++ - Eigen 中的自定义标量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747377/
Perl 中的标量是一个简单的数据单元 标量的值可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页 范例 : Perl 中标量的使用 #!/usr/bin/perl =pod
This question already has answers here: Querying Spark SQL DataFrame with complex types (3个答案) 2年前关闭
我有一个非常基本的问题,找不到解决方案,因此对于初学者的问题,请提前抱歉。 我有一个包含多个 ID 列和 30 个数字列的数据框。我想用相同的因子乘以这 30 列的所有值。我想保持数据框的其余部分不变
我想使用 UUID 作为标识符,但标准标量 ID 被强制转换为字符串。所以在我使用 ID 类型的任何地方都必须从字符串中解析 uuid。 我想知道是否可以用我自己的实现覆盖 ID 类型?这个标量类型有
我有一个函数数组farr,比如说 import numpy as np farr=np.array([(lambda x, y: x+y) for n in range(5)]) (实际上,函数都是不
请帮助我理解以下片段: my $count = @array; my @copy = @array; my ($first) = @array; (my $copy = $str) =~ s/\\/\
我有一个程序,我一直在玩弄,我偶然发现了这样的东西: unsigned char tmp[4]; ... if (mpu_write_mem(D_1_36, 2, tmp+2)) return
我需要很大的帮助,请查看这段代码: import.math dose =20.0 a = [[[2,3,4],[5,8,9],[12,56,32]] [[25,36,45][21,65,98
我要设计一个类PrimitiveType它作为标量、 vector 、张量等数学实体的抽象类,将它们存储在 std::vector myVector 中。我可以通过它进行迭代。例如,有两个相同大小的
这个问题在这里已经有了答案: int a = 0 and int a(0) differences [duplicate] (7 个答案) 关闭 3 年前。 据我所知在C++中是一个初始化的形式 T
perl 代码如下:问题是我无法读取 sub tweak_server{} 中的 $key .... my $key; my %hash = ( flintstones => [ "C:/Users1
我正在尝试使用 symfony3 连接到数据库,但问题是当我将密码放入parameters.yml 中时,出现此错误: 数据库密码:xx%xxxxx%x You have requested a no
我正在寻找 pd.cut 的等价物,但要寻找标量? 我想这样做: bins = [0, 5, 10, 15, 20, 25, 30, 40, 50, 100, 150] pd.cut(43, bins
到目前为止,我在互联网上找到的唯一帮助是 this blog .我认为这会让我到达那里,但我认为它实际上并没有改变我模块中的值。我做了一个示例来说明我的意思。 package Module; use
我盯着 perl LWP::Protocol.pm 中的这段代码,我不明白循环将如何退出: while ($content = &$collector, length $$content) {
两年来,我正在开发一个库:cyme通过“友好容器”执行 SIMD 计算。我能够达到处理器的最大性能。通常用户定义容器并根据以下语法编写内核(简单示例): for(i...) W[i] = R[i]
我正在开发一个 OpenCL 程序,但每次执行的输出都不同。我认为这与将参数传递给内核有关,因为当我对特定执行的值进行硬编码时,每次执行后的输出都是相似的。 我的内核看起来像这样: __kernel
我想在服务类中返回 JSON 文字 @GraphQLQuery(name = "renderUI", description = "Schema for your form") public Stri
我有一个使用 PDL 的函数.最后一步是点积,因此它返回一个标量。但是,当我尝试打印这个标量时,它显然仍然是一个小玩意,并在屏幕上打印如下: [ [ 3 ] ] 我想知道如何将它转换回常规的 Pe
首先,如果我的问题很简单,我深表歉意。我确实花了很多时间研究它。 我正在尝试在 PySpark 脚本中设置标量 Pandas UDF,如所述 here . 这是我的代码: from pyspark i
我是一名优秀的程序员,十分优秀!