【问题标题】:Sparse table in MATLAB, is it possible?MATLAB中的稀疏表,有可能吗?
【发布时间】:2016-05-11 17:40:15
【问题描述】:

\ 正在处理 MATLAB 中的一个矩阵,该矩阵是稀疏的并且具有许多行和列。在这种情况下,矩阵的行和列是特定项目的 ID。我们假设它们为id1id2

如果可以嵌入行和列的 id 那就太好了,这样我就可以轻松地访问它们,而无需创建额外的变量来保留这两个 id。

答案可能是使用 table 数据类型。表格是满足我需要的非常理想的答案,但是我想知道是否可以为稀疏矩阵创建表格数据类型?

A  [m*n] sparse matrix    %% m & n are huge 
id1 [1*m] , id2 [1*n]     %% two vectors containing numeric ids for rows and column

我们可以得到吗?

T  [m*n] sparse table matrix

感谢您与我分享您的观点。

【问题讨论】:

  • 查看 MATLAB sparse 函数的文档:mathworks.com/help/matlab/ref/sparse.html?refresh=true
  • Matlab 中没有sparse table 类。第一个原因是table() 可以有多个列的变量,在这种情况下您将如何定义稀疏性(反问问题)?与 sparse() 矩阵相比,您希望保留哪些特定于表的功能?
  • 谢谢,我在发帖前就这样做了。以table(sparse(rand(10,10))) 为例,使表格不稀疏,这不是我想要的。
  • Oleg:我的问题中提到的要求如下: 1. A 是一个包含许多零条目的巨大矩阵。最好是稀疏形式。 2.A的行和列有唯一的id,如果A的行和列有像Matlab中的表数据类型那样的标识符就好了。
  • 在我看来,如果我错了,请纠正我,你想要的是在变量编辑器中有一个很好的显示。但是请考虑,表格以非常不同的方式存储变量,并且具有类似 excel 的显示以及行和列标签的附加价值很快就会失去它的好处,尤其是在您的维度上。此外,表格不允许重塑其维度(尝试转置),或使用线性索引查询数据。

标签: matlab sparse-matrix matlab-table


【解决方案1】:

我将解决问题和 cmets 以消除一些混乱。

简短的回答

Matlab 中没有sparse table 类。不能做。使用 sparse() 矩阵。

长答案

稀疏表没有意义是有原因的:

  1. 从哲学上讲,如果您使用大量数据,则拥有漂亮的行和列标签的优势完全丢失和/或数据是否稀疏。

    滚动浏览 246829 行和 33336 列?如果您正在调试代码并且特定的异常值导致您的结果消失,则只能在非常孤立的时候有用。此外,您可能看到的只是一片零的海洋。

  2. 技术上一个表对于同一个变量可以有更多的列,即table(rand(10,2), rand(10,1)) 是一个有效的表。您如何考虑在此类表上定义稀疏性?

    很好,假设您正在使用类似矩阵的表格,即每个表格单元格一个元素和相同的数字类。尽管如此,没有一个代数运算符是在table() 上定义的。因此,您需要先提取内容,以便能够执行跨越多于单列数据的任何操作。为了清楚起见,一旦提取了数据,那么您就有了例如您的双(完整)矩阵或在理想情况下为双稀疏矩阵。

现在,有几个误解需要澄清:

  • 更少的变量意味着更清晰/更干净的代码。不对。您可能正在考虑how do I make a series of variables a1, a2, a3, etc. 的极端情况(在不良做法中)。

    在冗长和变量数量、cmets 数量和代码清晰度/可维护性之间存在一个最佳点。只有通过时间和经验,您才能找到合适的平衡点。

  • 没有目视检查就无法控制数据。这种方法不适用于大数据,你越早放弃它,你的代码就会越快变得越可靠。您需要系统地验证您的结果,而不是依靠目视检查。未能(直观地)发现数据中的问题,其维度呈指数增长,比系统测试更快。

关于我的工作的一些背景信息:

我使用高频价格,即数 TB 的数据。我还扩展了 table() 类,添加了其他方法和修复来帮助我完成工作(请参阅 https://github.com/okomarov/tableutils),但我看不出添加到 table() 中的稀疏性是多么有用的功能。

【讨论】:

  • 亲爱的奥列格,我认为您的回答令人信服,听起来合乎逻辑。感谢您花时间解释您的想法并与我分享您的观点。我认为您在最近的 cmets 中提到了非常有趣的观察结果。也许,我的问题是有动机的,因为我不经常处理大量数据。非常感谢,我会尽快在 github 上查看您的代码。我会将您的回复标记为答案。
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 2012-06-20
  • 2012-01-03
  • 2012-04-02
  • 1970-01-01
  • 2016-08-25
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多