【问题标题】:c++ - looking up sparse matrix values without loopsc++ - 在没有循环的情况下查找稀疏矩阵值
【发布时间】:2013-03-13 00:10:13
【问题描述】:

我有一个 C++ 程序,它期望输入文件格式为:

X    Y    Z
1    1    .642
1.1  1    .482
1.2  1    .394
1.3  1    .420
1.4  1    .948

文本文件很长 - 大约 20,000 行左右。我现在需要将其读入我的 C++ 程序,以便对任何 (X,Y) 对进行 Z 查找。如果 (X,Y) 对与我的输入文件中的任何对不完全相同,我需要使用最接近的 X 和最接近的 Y 值。如果我有一个完整的矩阵而不仅仅是非零值,那么 X 和 Y 坐标将是均匀分布的。

我的问题是确定最快的方法来做到这一点。我想避免实际上通过向量搜索最接近的 X,然后通过向量搜索最接近的 Y。有没有办法在不循环和搜索的情况下完成此操作?某种哈希表可以用来查找值吗?

我是一个脚本专家和 C++ 新手,所以如果这看起来微不足道,我深表歉意。所以作为参考,我需要快速的方法:

lookup(1.1,1)
    >>> .482

lookup(1.112, 1)
    >>> .482 // value corresponding to closest x and closest y

lookup(0,0)
    >>> .642 // value corresponding to closest x and closest y

如果我有完整的矩阵,这是可能的,例如:

    1.1  1.2  1.3  1.4  1.5
1.1
1.3
1.5      (Z values)
1.7
1.9

为了找到与 (1.5, 1.2) 相关的 Z 值,我可以简单地返回在索引 [1.5/(x_spacing), 1.2/(y_spacing)] 处找到的 Z 值。

当然,我还需要用这个间距减去我的查找值,如果不存在确切的 (X,Y) 对,则四舍五入。然而,最重要的是,它允许我在不进行任何搜索的情况下获得适当的 Z 值。我想完成同样的事情,除了不占用巨大的完整矩阵所需的所有空间。这就是为什么文本文件只包含对应于非零 Z 值的对的原因。

您能提供的任何帮助将不胜感激。

【问题讨论】:

  • 所以你的意思是问有没有办法以稀疏的方式解析文件?根据查找,可能只读取部分内容?
  • 我想读入整个文本文件并以这样的方式存储它,当我去查找一个值时,我可以在不“搜索”正确的 X 和 Y 键的情况下完成它。
  • 所以只需按照答案中的建议使用四叉树。

标签: c++ hashtable sparse-matrix


【解决方案1】:

我建议将其存储在结构化树中。以四叉树为例。它将是稀疏存储以节省空间,并且搜索最近点也很容易。

c++ 四叉树教程是here

【讨论】:

  • 我考虑过使用树。我想我真正要问的是是否有一种方法(类似于哈希表)来获取任何 X,Y 对并直接获取 Z。这在一张完整的桌子上是可能的。例如,我可以取任何 x 值,除以 X 坐标之间的差异(假设等距),这给了我正确的索引。我想完成同样的事情,而不必实际存储整个完整矩阵。
  • 哈希表可以工作,但如果您想要的 x y 不存在,则很难搜索平仓。
  • 有没有其他方法可以给我〜O(1)的复杂性?我是否可以在第一个程序(生成文件)的文件中提供其他信息,所以这可能是可能的?
  • 只有一个数组类型(如在一个巨大的地图中存储基于它的 x y 分量的数据)会给你 O(1) 访问,但它会更糟糕的搜索。它也不是稀疏的。
猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多