问题标签 [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 投票
4 回答
1361 浏览

c++ - 线性系统 Ax= b 当只有一个常数项改变时的有效解

当只有少数常数项发生变化时,如何有效地求解大型线性方程组。例如:

我目前有系统 Ax=b。我计算 A 的逆一次,将其存储在矩阵中,并且每次 b 中的任何条目更新执行矩阵向量乘法 A^-1(b) 以重新计算 x。

这是低效的,因为只有几个条目会在 b 中更新。当 A-1 保持不变但 b 中特定的已知值发生变化时,是否有更有效的方法来解决这个系统?

我使用 uBlas 和 Eigen,但不知道可以解决这个选择性重新计算问题的解决方案。感谢您的任何指导。

0 投票
2 回答
4735 浏览

c++ - 在以下示例中,为什么 Eigen 比 ublas 慢 5 倍?

在 Eigen 版本中,我使用“真正的”固定大小矩阵和向量,更好的算法(LDLT 与 uBlas 的 LU),它在内部使用 SIMD 指令。那么,为什么在下面的例子中它比 uBlas 慢?

我敢肯定,我做错了什么 - Eigen必须更快,或者至少具有可比性。

输出是:

(Visual Studio 2010 x64 版本)


编辑

为了

输出是:

我想,这种行为是由于 uBlas 版本就地计算分解,而 Eigen 版本创建了矩阵的副本(LDLT) - 所以它更适合缓存。

有没有办法在 Eigen 中进行就地计算?或者也许还有其他方法可以改进它?


编辑:

遵循 Fezvez 的建议并使用 LLT 而不是 LDLT 我得到:

这很好,但它仍然会进行不必要的矩阵堆栈分配:

我宁愿避免它 - 它应该更快。


编辑:

我通过从 LDLT 子类化(它的内部矩阵受到保护)删除了分配,并直接填充它。现在 LDLT 的结果是:

它有效,但它是解决方法 - 不是真正的解决方案......

LLT 的子类化也有效,但没有提供如此好的效果。

0 投票
1 回答
1658 浏览

linear-regression - 权重变化时加权最小二乘回归的有效重新计算

我正在执行wiki上描述的加权最小二乘回归:WLS

我需要解这个方程: $B= (t(X) W X)^{-1}*t(X) W y$

我使用 SVD 查找: $(t(X) W X)^{-1}$ 并将其存储在矩阵中。此外,我存储矩阵 $H= (t(X) W X)^{-1}*t(X) W$ 并对 y 的任何新值执行以下操作:B= H y。这样我就可以节省随着 y 的变化而重复 SVD 和矩阵乘法的成本。

W是对角矩阵,一般不会改变。但是有时我会更改 W 矩阵对角线上的一两个元素。在那种情况下,我需要再次执行 SVD 并重新计算 H 矩阵。这显然是缓慢且耗时的。

我的问题是:如果我知道 W 发生了什么变化而 X 没有任何变化,是否有更有效的方法来重新计算 (t(X) W X)^-1?

或者换句话说,考虑到只有 W 中的对角线元素可以改变已知量,是否有一种有效的分析方法可以找到 B?

0 投票
1 回答
308 浏览

c++ - 如何使用 Boost UBLAS 计算二次型?

我正在尝试使用 Boost UBLAS 计算 (x-mu)^T*SigmaInverse*(x-mu),其中 x 和 mu 是向量,SigmaInverse 是矩阵。代码如下所示:

我得到这个错误:

我做错了什么,我怎样才能让它工作?

0 投票
1 回答
1537 浏览

c++ - 如何使用 boost ublas 理解和修复递归模板实例化错误?

我收到编译器错误

来自 clang++ 或从 g++ 4.2.1 使用 >10GB 内存使用的无限期编译。

我正在尝试创建一个辅助函数,该函数从向量的每个元素中减去一个标量。起初一般考虑,我计划将特定的向量存储类型作为模板参数。话虽如此,我意识到我现在不知道如何使定义同时适用于向量ublasstd向量(没有专门化)。但我仍然想知道发生了什么/我的编译问题的原因?

当与 boost 库兼容时,下面的代码很容易证明这个问题,例如 g++ -I/path/boost bug_demo.cpp

boost 中或我的代码中是否存在错误?

0 投票
0 回答
445 浏览

c++ - 多精度数的 Boost 矩阵乘积

我正在尝试在 VS 2010 Express 中使用 Boost.Multiprecision 和 Boost.uBLAS 在 C++ 中实现一些高精度计算。但是,即使在最简单的情况下,我的代码也无法编译,并出现以下错误:

错误 C2677:二进制“+=”:未找到采用“boost::multiprecision::detail::expression”类型的全局运算符(或没有可接受的转换)c:\program files (x86)\boost_1_53_0\boost\numeric \ublas\functional.hpp 1176

编译器抱怨的那行在 ublas 的functional.hpp 中:

我使用 anumber<cpp_dec_float<50> >作为高精度浮点数的类型,实例化两个矩阵 E 和 m - 这很好用。但是,如果我尝试使用 prod 将它们相乘,则代码无法编译。此处提供的多精度常见问题解答建议将 prod 的所有参数显式转换为高精度类型,但prod(static_cast<matrix<number<cpp_dec_float<50> > > >(E),static_cast<matrix<number<cpp_dec_float<50> > > >(m) )无济于事。

知道我还缺少什么吗?提前致谢。

0 投票
0 回答
218 浏览

c++ - How to perform an operation on a subset of elements in a Boost::uBlas::vector?

Suppose you have a long boost::numeric::ublas::vector and you want to perform an update operation on a subset of the elements. How many of the elements should be updated is somewhere between "all" or "none". Which elements to update is given by a sparse compressed_vector containing a "1" for each element that should be updated.

I could think of two ways to solve this problem:

  1. Just multiplying the right hand side with a mask:

    Problem with this is that it looks quite inefficient: wouldn't ublas calculate the whole vector and then just throw away all unused values in this case (ie. where update_mask==0)?

    I'd expect it to be even slower than just

    which would be horribly inefficient if only a few elements have to be updated.

  2. Loop over all values to update

    The problem with this is that a) it looks awful, b) kinda defeats the purpose of using vectors in the first place and c.) should be horribly inefficient if a lot of indices are to be updated and/or the operation becomes more complex.

Any ideas on how to do this efficiently? I'm pretty sure this is a fairly common problem, but I couldn't find anything useful about it (and the ublas documentation is ... not fun).

0 投票
2 回答
1160 浏览

c++ - 函数外的 Ublas 向量初始化

我想将一个特定的 boost ublas 向量声明为全局变量。问题是在函数外部声明总是会导致错误。

这是一个具体的例子:

以下代码将给出多个错误:( error C2143: syntax error : missing ';' before '<<=' error C4430: missing type specifier - int assumed. error C2371: 'test' : redefinition; different basic types)

将声明移动到主程序但是有效

0 投票
1 回答
196 浏览

c++ - 从二进制文件中读取 ublas 向量或使用 array[] 初始化它

为什么我不能以如下方式从二进制文件中读取 ublas 向量(而不是一次读取一个元素):

有没有办法从数组中初始化 ublas 向量?

0 投票
1 回答
521 浏览

c++ - Boost.uBLAS 中的矩阵表达式和向量表达式类是什么?

我试过阅读 Boost Documentation,但我不明白这个表达概念。Matrix 类继承了一个matrix_expression 类,我不明白这个类是干什么用的。

谢谢你。