问题标签 [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.

0 投票
1 回答
1112 浏览

c++ - 将 Boost ublas 矩阵写入文本文件

我有一个 Boost ublas 矩阵,我想将它的内容打印到一个文本文件中。我有以下实现,它可以工作。

我想在不使用嵌套 for 循环的情况下编写此代码。我尝试了 ostreambuf_iterator API,如下所示

然而,正如你所看到的,连续的元素被写在新的一行上,我无法像嵌套 for 循环那样实现排序类型。有没有办法做我在嵌套中使用 STL 算法所做的事情?

0 投票
1 回答
2364 浏览

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还是我的功能不对?我可以做些什么来避免这个错误?

0 投票
1 回答
335 浏览

c++ - 创建一个 c_vector

是否可以在一行中c_vector<int, 3>使用值[12 398 -34](例如)创建一个?

所知,唯一可行的构造函数是:

它需要 a VectorExpression,这似乎是所有其他类型的向量,例如动态分配的zero_vectorscalar_vector

std::initializer_list<T>有没有我可以使用的构造函数之类的东西?或者我VectorExpression应该用什么来完成这个简单的任务?

0 投票
2 回答
88 浏览

c++ - 如何模拟数组的 ba​​ck() 方法?

boost::numeric::ublas::vector 中没有 back() 方法,是否可以在用户代码中使用预处理器宏以某种方式定义来模拟它array_name[array_name.size()-1]

array_name[i].rbegin()->operator[] (i) = 1.0array_name[i][array_name[i].size()-1][i] = 1.0难以阅读,array_name[i].back()[i] = 1.0易于阅读,这就是我想模仿 back() 方法的原因。

0 投票
1 回答
108 浏览

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);.

有谁知道为什么会这样?如果有人对这个主题有一些了解,那将是一个很大的帮助。

非常感激。

好心,何塞·诺盖拉

0 投票
1 回答
765 浏览

c++ - 使用 Boost Ublas lu_Factorize 时出错

我正在尝试制作一个有趣的项目,该项目使用 BOOST Ublas 制作矩阵幂函数。它与矩阵的这个Numpy 库幂函数非常相似,它使用矩阵求幂来计算矩阵在对数时间内的 n 次幂。计算矩阵的 n 次方有 3 种情况:

  1. 如果 power > 0直接使用矩阵求幂
  2. 如果 power = 0 检查矩阵是否有逆矩阵(检查 Using lu_factorize),如果是,则返回单位矩阵
  3. 如果 Power < 0 找到逆(如果存在), 则对其使用矩阵求幂

我擅长算法和实现,但这是我第一次使用任何开源库,我想学习这个,这样我最终可以为提升做出贡献。

这是我的头文件

我正在使用这个测试这个头文件

这些函数在幂 > 0 的情况下工作得很好,因为它直接使用矩阵求幂。该工作比重复乘法快得多,我已经看到大约 1000 次迭代的运行时间和使用循环的时间相差 100-1000 倍。您可以观察到,但是对于功率 <=0,i Get 有时会得到不正确的答案。(我使用矩阵和逆矩阵的乘积是单位矩阵的想法检查了这一点)

这可能与 lu_factorize 和 lu_substitute 有关,它们进行了某些检查以确保变量类型正确。

由于它们没有可用于 lu_factorize 的文档,因此我不确定如何使用它。(我刚刚阅读了一个使用 Ublas lu_factorize 和 lu_substitute 计算矩阵逆的示例。我什至阅读了源代码,但由于缺乏经验,代码掌握得并不多。

我现在对我遇到的问题有几个问题。由于这是我第一次尝试提升,如果我问一些愚蠢的问题,请不要对我苛刻。所以这些是我的问题 -

  1. 不正确的答案可能是由于数据类型之间的不正确转换,或类似的东西。我该如何解决这个问题?我如何确保在每一步都使用正确的数据类型?
  2. 当用户输入不正确的类型时,我如何给出错误,我知道我可以使用 boost assert 但这会产生大量难以理解的编译错误。确保输入类型有效的最简单方法是什么。例如,如果用户提供输入字符串,我想给出一个错误。你能为此提供一个例子吗?
  3. 我尝试了各种方法来解决编译错误,其中一种是使用#define BOOST_UBLAS_TYPE_CHECK 0 这有助于绕过数据类型的编译错误,但后来我得到了不正确的答案。你能解释一下至少在这种情况下它是如何工作的吗?

  4. 由于这是我第一次尝试从提升中做出任何事情,我可以理解这当然可以做得更好。此头文件中必须存在哪些其他内容以确保诸如错误处理、支持多个编译器等库标准?

0 投票
0 回答
221 浏览

c++ - 提升多精度 + 数字绑定 + LAPACK

我正在尝试使用boost 多精度模板库结合lapack后端的数字绑定来实现一些数字过程。

但是,模板解析似乎没有按预期工作。我已经能够将其缩小到这个最小的例子:

这会产生此错误消息:

是否有可能将其lapack用作模板化到多精度的提升的后端UBLAS,或者这是徒劳的努力?有没有其他方法可以做一个 ublas 多精度矩阵的特征向量分解?

0 投票
1 回答
258 浏览

c++ - 为什么应用程序在向类添加新函数后编译但在链接阶段失败?

我的项目正在使用以下内容构建 : Eclipse,,, CMakeLists.txtMinGW 4.8.1

项目编译正常,应用链接正常。但添加后,

'Helper.cpp' 中的 3 个函数和 'CamData.cpp' 中的 2 个函数,类型为 boost::ublas::matrix

链接器放弃了,并且无法再找到函数(未定义的引用错误),尽管它可以编译它们(编译目标文件 *.cpp.obj 时没有错误)。

代码结构

Helper 类中创建的函数如下。CamData 中的 2 个函数也属于类似类型:

cmakelist.txt的相关部分如下:

注释掉 main.cpp 中的函数和它们的调用后,可以再次链接程序。关于可能导致这种情况的任何想法?

下面的错误日志

0 投票
1 回答
199 浏览

c++ - Boost 是否提供打印 uBLAS 数据类型的工具?

我正在调试一个大量使用 uBLAS 向量和矩阵的应用程序。我想将它们打印到控制台,例如:

确切的输出格式确实很重要,我只想看看矢量内容。operator<<Boost 是否为std::ostreamuBLAS 类型提供了这样的重载?任何其他打印 uBLAS 类型的简短方法也可以。自己编写这些函数并不是一件大事,但我正在寻找一种“标准”技术来完成它,如果有的话。

0 投票
1 回答
599 浏览

c++ - C++ 模板和 OpenBLAS

存在实现矩阵类型和计算的 C++ 库,例如 Eigen 或 Boost::uBlas。

还存在诸如 LAPACK、Goto-BLAS、OpenBLAS 和 ATLAS 之类的库,它们在浮点类型上实现高度优化的密集矩阵计算。

我想知道是否某些 C++ 库(可能通过专门化)为 OpenBLAS 支持的类型调用 OpenBLAS。这似乎是两全其美。