1

鉴于我有一个这样的数组:

array = [Array[8], Array[8], Array[8], ...]
# array.length is 81; each octet represents a point on a 9x9 grid

每个嵌套数组包含 8 个数字元素,范围从-22,我将如何应用以下步骤在 Javascript 中获取向量?

步骤 5. 图像的签名只是与网格点相对应的 8 元素数组的串联,从左到右、从上到下排列。因此,我们的签名是长度为 648 的向量。我们将它们存储在 648 字节的数组中,但是因为已知第一行和最后一行和列的某些条目为零,并且因为每个字节仅用于保存 5 个值,所以签名可以用 ⌈544 log 2 5⌉ = 1264 位来表示。

(最后,这些应该是上限符号;鉴于 SO 缺乏乳胶格式,我能做到的最好)

我已经准备好阵列并正确订购,但是我对矩阵和向量的了解有点生疏,所以我不确定下一步如何处理。我将不胜感激任何澄清!


背景:我正在尝试创建一个由施乐帕洛阿尔托研究中心发布的图像处理算法的 JS 实现,用于我目前正在从事的一个副项目。

4

1 回答 1

0

从概念上讲,您可以使用以下算法将其转换为单个 1264 位数:

  1. 将累加器变量初始化为零
  2. 遍历所有元素,但跳过那些你知道为零的元素
  3. 对于其他元素,加 2 以获得 [0,1,2,3,4] 范围内的值
  4. 对于每个这样的值,将累加器乘以 5,然后添加相应的值
  5. 处理完所有元素后,累加器将对数组进行编码

要反转该编码,您可以这样做:

  1. 将编码值读入累加器
  2. 以相反的顺序遍历所有元素,但跳过那些你知道为零的元素
  3. 对于每个元素,您将获得相应的值作为累加器模 5
  4. 从该值中减去 2
  5. 使用截断除法将累加器除以 5

所有这一切的问题在于 JS 没有提供开箱即用的 1264 位数字。您可以尝试如何处理 javascript 中的大数字中建议的库之一。

但是,除非您绝对需要极小的表示形式,否则我建议您使用另一种方法:您可以在 32 位有符号整数中编码多达 13 个这样的值,因为 5 13 =1,220,703,125 < 2,147,483,648=2 31。因此,在对 13 个值进行编码后,我会使用这样的数字写出结果,然后将累加器重置为零。这样,您将需要 ⌈544/13⌉∙32=1376 位,这在空间要求方面并没有那么糟糕,但实施起来会快很多。

不是向前迭代一次,反向迭代一次,不将累加器乘以 5 可能更容易,而是将添加到该累加器的值乘以 5 的合适幂。换句话说,您保持一个因子初始化为 1,每次添加一个值时乘以 5。因此,在这种情况下,对于编码和解码,第一个数据值的重要位置将低于后面的数据值,这意味着您可以对两者使用相同的迭代顺序。

有关后一种方法的示例,请参阅下面我的评论中提到的 ideone 链接。它将完整的 9*9*8 值编码为 50 个整数,每个整数使用不超过 31 位。然后它从该编码形式解码原始矩阵,以显示所有信息仍然存在。该示例不使用任何固定零,在您的情况下 ⌈544/13⌉=42 个整数就足够了。

于 2013-04-10T14:55:23.300 回答