问题标签 [sparse-matrix]
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.
r - R最成熟的稀疏矩阵包?
R 至少有两个稀疏矩阵包。我正在研究这些包,因为我使用的数据集太大且太稀疏,无法以密集表示形式放入内存中。我想要基本的线性代数例程,以及轻松编写 C 代码对其进行操作的能力。哪个库最成熟最好用?
到目前为止我发现
- 具有许多反向依赖关系的矩阵,这意味着它是最常用的一个。
- 没有那么多反向依赖的SparseM 。
- 各种图形库可能有自己的(隐式)版本;例如igraph和network(后者是statnet的一部分)。这些对我的需求来说太专业了。
有人有这方面的经验吗?
稍微搜索一下RSeek.org , Matrix包似乎是最常被提及的一个。我经常认为CRAN 任务视图相当权威,多变量任务视图提到了 Matrix 和 SparseM。
algorithm - 在大型稀疏矩阵中找到“最大”的密集子矩阵
给定一个大的稀疏矩阵(比如 10k+ x 1M+),我需要找到一个子集,不一定是连续的,形成密集矩阵(所有非零元素)的行和列。我希望这个子矩阵在某些纵横比约束内尽可能大(不是最大的总和,而是最大的元素数量)。
是否有任何已知的确切或近似的解决方案来解决这个问题?
在 Google 上快速浏览一下似乎会给出很多接近但不完全准确的结果。我应该寻找哪些条款?
编辑:只是为了澄清;子矩阵不必是连续的。事实上,行和列的顺序是完全任意的,所以相邻性是完全无关的。
基于 Chad Okere 的想法
- 将行从最大计数排序到最小计数(不是必需的,但可能有助于提高性能)
- 选择具有“大”重叠的两行
- 添加不会减少重叠的所有其他行
- 记录那套
- 添加任何行以最少的方式减少重叠
- 在 #3 重复,直到结果变小
- 使用不同的起始对从 #2 重新开始
- 继续直到你认为结果足够好
c - 稀疏多维数据表示
我正在研究使用 4 维数据的心脏模拟工具,即 3D 空间中位置的几个 (3-30) 变量。
我现在添加了一些组织几何结构,这将使包含的 3D 框中超过 2/3 的点留在要模拟的组织之外,因此我需要一种有效存储活动点而不是其他点的方法。
至关重要的是,我需要能够:
- 迭代受约束的 3D 框内的所有活动点(也许是迭代器?)
- 访问一个点后,找到它的正交邻居 (x,y,z) +/- 1。
这可能不止一个问题!我主要关心的是如何有效地表示稀疏数据。
我正在使用 C。
r - 创建(和访问)具有 NA 默认条目的稀疏矩阵
在了解了在 R 中使用稀疏矩阵的选项之后,我想使用Matrix包从以下数据框创建一个稀疏矩阵,并让所有其他元素成为NA
.
我知道我可以使用以下内容创建一个稀疏矩阵,像往常一样访问元素:
但如果我想将默认值设为 NA,我尝试了以下操作:
并得到了这个错误
不仅如此,我发现访问元素需要更长的时间。
我应该如何创建这个矩阵?为什么使用一个矩阵要慢得多?
以下是上述数据的代码片段:
c++ - 访问 boost sparse_matrix 的元素似乎停止了程序
我有一个奇怪的错误,我希望有更多经验的程序员可能对此有所了解。我正在使用 boost ublas 稀疏矩阵,特别是 mapped_matrix,并且最终会出现一个间歇性错误,但不是在程序的初始阶段。这是一个大程序,所以我不能发布所有代码,但核心思想是我调用一个属于特定类的函数:
变量 c 被定义为类的成员
当错误发生时,程序似乎停止(但不会崩溃)。使用 Eclipse 进行调试,我可以看到程序进入了 boost mapped_matrix 代码并继续向下几个级别进入 std::map、std::_Rb_tree 和 std::less。此外,该程序偶尔会追溯到 std::map、std::_Rb_tree 和 std::_Select1st。当代码正在执行并且_Rb_tree 中内存中的活动行发生变化时,执行似乎永远不会在std::map 级别返回。程序卡在 std::map 中的行是以下函数的返回。
在我看来,程序正在寻找 c 矩阵中的某些元素,但不知何故,底层存储机制“放错了位置”。但是,我不确定为什么或如何解决它。这也可能完全不合时宜。
您能提供的任何帮助将不胜感激。如果我没有在这个问题中包含正确的信息,请让我知道我缺少什么。谢谢你。
perl - 捕获稀疏矩阵的非零元素、计数和索引
我有以下稀疏矩阵A。
然后我想从那里捕获以下信息:
条目的累积计数,因为矩阵是按列扫描的。产量:
Ap = [ 0, 2, 5, 9, 10, 12 ];
条目的行索引,因为矩阵是按列扫描的。产量:
Ai = [0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4];
非零矩阵条目,因为矩阵是按列扫描的。产量:
Ax = [2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1];
由于实际矩阵 A 可能非常大,Perl 中是否有任何有效的方法可以捕获这些元素?尤其是在没有将所有矩阵 A 放入 RAM 的情况下。
我被以下代码困住了。这没有给我想要的。
c++ - 遍历两个稀疏矩阵
我正在使用bool的boost稀疏矩阵并尝试编写一个比较函数来将它们存储在地图中。这是一个非常简单的比较功能。基本上,这个想法是将矩阵视为二进制数(在被展平为向量之后)并根据该数字的值进行排序。这可以通过以下方式完成:
但是,由于矩阵的稀疏性,这是低效的,我想使用迭代器来获得相同的结果。使用迭代器的算法看起来很简单,即 1) 获取每个矩阵中的第一个非零单元,2) 比较两者的 j*maxJ+i,3) 如果相等,则获取每个矩阵中的下一个非零单元并重复。不幸的是,在代码中这是非常乏味的,我担心错误。
我想知道的是(a)是否有更好的方法来做到这一点,(b)是否有一种简单的方法可以为两个矩阵获取“下一个非零单元格”?显然,我不能使用嵌套的 for 循环来遍历一个稀疏矩阵。
谢谢你的帮助。
--
由于看起来我上面提出的算法可能是我特定应用程序中的最佳解决方案,我想我应该发布我为棘手部分开发的代码,在两个稀疏矩阵中获取下一个非零单元格。这段代码并不理想,也不是很清楚,但我不知道如何改进它。如果有人发现错误或知道如何改进它,我将不胜感激。否则,我希望这对其他人有用。
c++ - 为稀疏向量重载运算符 []
我正在尝试在 C++ 中创建一个“稀疏”矢量类,如下所示:
在内部,它将由一个表示std::map<int, V>
(其中V
存储的值的类型)。如果地图中不存在元素,我们将假装它等于Default
模板参数中的值。
但是,我在重载下标运算符时遇到了问题,[]
. 我必须重载[]
运算符,因为我将此类中的对象传递到期望[]
正常工作的 Boost 函数中。
这个const
版本很简单:检查索引是否在地图中,如果是则返回其值,Default
否则。
但是,非常量版本要求我返回一个引用,这就是我遇到麻烦的地方。如果值只是被读取,我不需要(也不想)向地图添加任何东西;但如果它正在被写入,我可能需要在地图中添加一个新条目。问题是重载[]
不知道一个值是被读取还是被写入。它只返回一个引用。
有没有办法解决这个问题?或者也许可以解决它?
c# - C# 的稀疏线性代数求解器
我正在用 C# 实现 Goldenthal et.al 的不可扩展布料算法的实验性实现。
首先我使用 Math.NET Iridium 来组装和求解矩阵,但很快将其替换为 dnAnalytics,因为后者允许我重用矩阵,几乎消除了进一步的内存分配,这对于实时性能(小布)或迭代求解很重要一般来说。
问题是 dnAnalytics 中的求解器(主要感兴趣的是 LU 和 Bi-CG)仍然在幕后分配矩阵和向量,而不是重用过去的分配。
=> 是否有任何稀疏线性代数库可以开箱即用地重用内存,还是我必须自己重写代码?
algorithm - 另一个生命游戏问题(无限网格)?
我一直在玩 Conway 的生命游戏,最近发现了一些非常快的实现,例如 Hashlife 和 Golly。(在这里下载 Golly - http://golly.sourceforge.net/)
我无法理解的一件事是编码人员如何实现无限网格?我们不能保留无限的任何东西,如果你跑得好,让几架滑翔机飞过边缘,等待几分钟并立即缩小,你会看到滑翔机仍然在太空中逃跑,那么以上帝的名义如何以编程方式处理这个无穷大的概念呢?是否有一个有据可查的模式或什么?
非常感谢