【问题标题】:Concatenate nested array to vector?将嵌套数组连接到向量?
【发布时间】:2013-04-01 23:19:11
【问题描述】:

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

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 log2 5⌉ = 1264 表示 位。

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

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


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

【问题讨论】:

  • 您是否只需要连接数组或执行一些压缩优化?
  • @Barmaley.exe 我现在只是在寻找连接,但我当然也想在某个时候添加压缩优化,前提是压缩/解压缩对系统资源不太密集。
  • 如果只是将 81 个 8 字节数组连接到一个 648 字节大数组,请使用 bigarray = [].concat.apply([], array);
  • @Bergi 是的,这行得通,但我想我想我会以某种形式结束——比如整数而不是数组。我最终想将它存储在某种数据库中...... MvG 使用 32 位有符号整数的方法(如下)因此很有吸引力,但如果我理解数学,它还不足以容纳向量。我有这个权利,还是我错过了什么?
  • 您想在 JavaScript 中计算 1264 位整数吗?祝你好运 :-) 那么你可能想看看typed arrays

标签: javascript arrays math matrix linear-algebra


【解决方案1】:

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

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

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

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

所有这一切的问题在于 JS 没有提供开箱即用的 1264 位数字。您可以尝试How to deal with big numbers in javascript 中建议的库之一。

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

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

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

【讨论】:

  • 好的,我想我明白了。我不清楚的是“你可以在一个 32 位有符号整数中编码多达 13 个这样的值”......我应该提到上面的数组包含 81 个八位字节集(每个代表 9x9 网格上的一个点) ,所以这意味着我不能使用 32 位有符号整数,对吗?关于“累加器将对您的数组进行编码”(作为原始算法中第 5 步的一部分)还有一点不清楚 - 那里是否发生了其他逻辑,或者您只是说此时累加器的值将是编码的向量?
  • @neezer:最后,累加器将对向量进行编码,无需额外步骤。当您为每 13 个值切换到 32 位时,您将对每 13 个这样的集合执行一次步骤 1 和 5,而不仅仅是对所有 544 个值一起执行一次。有关示例,请参见 ideone.com/CgeDDj
  • 太好了,这很有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多