问题标签 [boost-ublas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将 Boost ublas 矩阵写入文本文件
我有一个 Boost ublas 矩阵,我想将它的内容打印到一个文本文件中。我有以下实现,它可以工作。
我想在不使用嵌套 for 循环的情况下编写此代码。我尝试了 ostreambuf_iterator API,如下所示
然而,正如你所看到的,连续的元素被写在新的一行上,我无法像嵌套 for 循环那样实现排序类型。有没有办法做我在嵌套中使用 STL 算法所做的事情?
c++ - boost::ublas 如何获得 int 矩阵的行列式?
我找到了计算 boost::ublas 矩阵行列式的函数:
此函数工作正常,但仅适用于非整数类型(它适用于浮点和双精度)。当我尝试传递相同的矩阵但类型为 int 时,我收到编译错误:
在第 167 行的文件 c:\boost\boost_1_58_0\boost\numeric\ublas\lu.hpp 中检查失败:singular != 0 || detail::expression_type_check (prod (triangular_adaptor (m), triangular_adaptor (m)), cm) 未知位置 (0):“BaseTest”中的致命错误:std::logic_error:内部逻辑
是boost的bug还是我的功能不对?我可以做些什么来避免这个错误?
c++ - 创建一个 c_vector
是否可以在一行中c_vector<int, 3>
使用值[12 398 -34]
(例如)创建一个?
据我所知,唯一可行的构造函数是:
它需要 a VectorExpression
,这似乎是所有其他类型的向量,例如动态分配的zero_vector
和scalar_vector
。
std::initializer_list<T>
有没有我可以使用的构造函数之类的东西?或者我VectorExpression
应该用什么来完成这个简单的任务?
c++ - 如何模拟数组的 back() 方法?
boost::numeric::ublas::vector 中没有 back() 方法,是否可以在用户代码中使用预处理器宏以某种方式定义来模拟它array_name[array_name.size()-1]
?
array_name[i].rbegin()->operator[] (i) = 1.0
或
array_name[i][array_name[i].size()-1][i] = 1.0
难以阅读,array_name[i].back()[i] = 1.0
易于阅读,这就是我想模仿 back() 方法的原因。
c++ - 由于从未运行的函数调用,程序花费(很多)比它应该的时间更长
我目前正在运行用 C++ 编写的贝叶斯优化。我使用来自 Ruben Martinez-Cantin ( http://rmcantin.bitbucket.org/html/ ) 的工具箱调用 Bayesopt。我正在写关于贝叶斯优化的论文(https://en.wikipedia.org/wiki/Bayesian_optimization)。
我之前曾尝试过这个工具箱,本周我注意到代码的运行速度比我记忆中的要慢得多。值得一提的是,我确实编写了一些适用于此工具箱的代码。
我决定尝试了解为什么会发生这种情况,并且我确实见证了代码的运行速度比它应该运行的要慢得多。
为了试图了解这是否是我的代码的错误,我尝试了一个不使用我的任何代码的示例。
考虑以下示例:
如果我单独编译这个例子,运行时间大约是 23 秒。
有了这个 cmake 文件
现在考虑相同的主要示例,但是我在我的 cmake 项目中添加了三个附加文件(不包括在 main.cpp 中)。这三个文件是我所有代码的子部分。
这次,运行时间约为 3 分钟。这对我的工作至关重要,因为如果我增加par.n_iterations
它往往会变得更糟。
我进一步得出结论,如果我在 TGPNode.cpp 中注释一行
我得到了 23 秒。该函数属于一个文件:ublas_cholesky.hpp,来自bayesopt 工具箱。
同样重要的是要注意在工具箱代码中也会调用相同的函数。此行没有注释,它在michalewicz.optimize(result);
.
有谁知道为什么会这样?如果有人对这个主题有一些了解,那将是一个很大的帮助。
非常感激。
好心,何塞·诺盖拉
c++ - 使用 Boost Ublas lu_Factorize 时出错
我正在尝试制作一个有趣的项目,该项目使用 BOOST Ublas 制作矩阵幂函数。它与矩阵的这个Numpy 库幂函数非常相似,它使用矩阵求幂来计算矩阵在对数时间内的 n 次幂。计算矩阵的 n 次方有 3 种情况:
- 如果 power > 0直接使用矩阵求幂
- 如果 power = 0 检查矩阵是否有逆矩阵(检查 Using lu_factorize),如果是,则返回单位矩阵
- 如果 Power < 0 找到逆(如果存在), 则对其使用矩阵求幂
我擅长算法和实现,但这是我第一次使用任何开源库,我想学习这个,这样我最终可以为提升做出贡献。
这是我的头文件
我正在使用这个测试这个头文件
这些函数在幂 > 0 的情况下工作得很好,因为它直接使用矩阵求幂。该工作比重复乘法快得多,我已经看到大约 1000 次迭代的运行时间和使用循环的时间相差 100-1000 倍。您可以观察到,但是对于功率 <=0,i Get 有时会得到不正确的答案。(我使用矩阵和逆矩阵的乘积是单位矩阵的想法检查了这一点)
这可能与 lu_factorize 和 lu_substitute 有关,它们进行了某些检查以确保变量类型正确。
由于它们没有可用于 lu_factorize 的文档,因此我不确定如何使用它。(我刚刚阅读了一个使用 Ublas lu_factorize 和 lu_substitute 计算矩阵逆的示例。我什至阅读了源代码,但由于缺乏经验,代码掌握得并不多。
我现在对我遇到的问题有几个问题。由于这是我第一次尝试提升,如果我问一些愚蠢的问题,请不要对我苛刻。所以这些是我的问题 -
- 不正确的答案可能是由于数据类型之间的不正确转换,或类似的东西。我该如何解决这个问题?我如何确保在每一步都使用正确的数据类型?
- 当用户输入不正确的类型时,我如何给出错误,我知道我可以使用 boost assert 但这会产生大量难以理解的编译错误。确保输入类型有效的最简单方法是什么。例如,如果用户提供输入字符串,我想给出一个错误。你能为此提供一个例子吗?
我尝试了各种方法来解决编译错误,其中一种是使用#define BOOST_UBLAS_TYPE_CHECK 0 这有助于绕过数据类型的编译错误,但后来我得到了不正确的答案。你能解释一下至少在这种情况下它是如何工作的吗?
由于这是我第一次尝试从提升中做出任何事情,我可以理解这当然可以做得更好。此头文件中必须存在哪些其他内容以确保诸如错误处理、支持多个编译器等库标准?
c++ - 提升多精度 + 数字绑定 + LAPACK
我正在尝试使用boost
多精度模板库结合lapack
后端的数字绑定来实现一些数字过程。
但是,模板解析似乎没有按预期工作。我已经能够将其缩小到这个最小的例子:
这会产生此错误消息:
是否有可能将其lapack
用作模板化到多精度的提升的后端UBLAS
,或者这是徒劳的努力?有没有其他方法可以做一个 ublas 多精度矩阵的特征向量分解?
c++ - 为什么应用程序在向类添加新函数后编译但在链接阶段失败?
我的项目正在使用以下内容构建
:
Eclipse
,,,
CMakeLists.txt
MinGW 4.8.1
项目编译正常,应用链接正常。但添加后,
'Helper.cpp' 中的 3 个函数和 'CamData.cpp' 中的 2 个函数,类型为 boost::ublas::matrix
链接器放弃了,并且无法再找到函数(未定义的引用错误),尽管它可以编译它们(编译目标文件 *.cpp.obj 时没有错误)。
代码结构
Helper 类中创建的函数如下。CamData 中的 2 个函数也属于类似类型:
cmakelist.txt的相关部分如下:
注释掉 main.cpp 中的函数和它们的调用后,可以再次链接程序。关于可能导致这种情况的任何想法?
下面的错误日志
c++ - Boost 是否提供打印 uBLAS 数据类型的工具?
我正在调试一个大量使用 uBLAS 向量和矩阵的应用程序。我想将它们打印到控制台,例如:
确切的输出格式确实很重要,我只想看看矢量内容。operator<<
Boost 是否为std::ostream
uBLAS 类型提供了这样的重载?任何其他打印 uBLAS 类型的简短方法也可以。自己编写这些函数并不是一件大事,但我正在寻找一种“标准”技术来完成它,如果有的话。
c++ - C++ 模板和 OpenBLAS
存在实现矩阵类型和计算的 C++ 库,例如 Eigen 或 Boost::uBlas。
还存在诸如 LAPACK、Goto-BLAS、OpenBLAS 和 ATLAS 之类的库,它们在浮点类型上实现高度优化的密集矩阵计算。
我想知道是否某些 C++ 库(可能通过专门化)为 OpenBLAS 支持的类型调用 OpenBLAS。这似乎是两全其美。