将嵌套数组连接到vector?

时间:2013-04-10 08:12:07

标签: javascript arrays math matrix linear-algebra

鉴于我有这样的数组:

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字节的数组中,但是因为它们的一些   已知第一行和最后一行和列的条目为零   并且因为每个字节仅用于保存5个值,所以签名可以   由⌈544log 2 5⌉= 1264表示   位。

(接近结束时,那些应该是天花板符号;考虑到SO缺少Latex格式,我能做到最好)

我已经准备好了阵列并正确排序,但我对matricies和vector的知识有点生疏,所以我不确定如何解决下一步。我很感激任何澄清!


背景:我正在尝试创建一个由Xerox Palo Alto研究中心发布的图像处理算法的JS实现,用于我正在进行的一个侧面项目。

1 个答案:

答案 0 :(得分:0)

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

  1. 将累加器变量初始化为零
  2. 迭代所有元素,但跳过那些你知道为零的元素
  3. 对于其他元素,添加2以获取[0,1,2,3,4]
  4. 范围内的值
  5. 对于每个此类值,将累加器乘以5,然后添加相应的值
  6. 处理完所有元素后,累加器将对数组进行编码
  7. 要反转该编码,请执行以下操作:

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

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

      但除非你绝对要求一个非常小的表示,我建议另一种方法:你可以在32位有符号整数中编码多达13个这样的值,因为5 13 < / sup> = 1,220,703,125&lt; 2147483648 = 2 31 。因此,在编码13个值后,我将使用这样的数字写出结果,然后将累加器重置为零。这样你就需要⌈544/13⌉∙32 = 1376位,这在空间要求方面并没有那么差,但实现起来会更快

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

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