Language agnostic 压缩二进制矩阵

Language agnostic 压缩二进制矩阵,language-agnostic,binary,matrix,compression,Language Agnostic,Binary,Matrix,Compression,我们被要求找到一种方法来尽可能多地压缩一个平方二进制矩阵,如果可能的话,添加冗余位来检查和纠正错误 在我看来,冗余很容易实现。复杂的部分是压缩矩阵。在将矩阵重塑为向量后,我考虑过使用游程长度,因为会有更多的零而不是一,但我只实现了40位压缩(我们正在处理小尺寸),尽管我认为这会更好 此外,在运行长度之后,一个想法是哈夫曼编码矩阵,但必须发送字典以恢复原始信息 我想知道压缩二进制矩阵的最佳方法是什么 在阅读了一些评论之后,yes@Adam you's right,14x14矩阵应该压缩为128位,

我们被要求找到一种方法来尽可能多地压缩一个平方二进制矩阵,如果可能的话,添加冗余位来检查和纠正错误

在我看来,冗余很容易实现。复杂的部分是压缩矩阵。在将矩阵重塑为向量后,我考虑过使用游程长度,因为会有更多的零而不是一,但我只实现了40位压缩(我们正在处理小尺寸),尽管我认为这会更好

此外,在运行长度之后,一个想法是哈夫曼编码矩阵,但必须发送字典以恢复原始信息

我想知道压缩二进制矩阵的最佳方法是什么


在阅读了一些评论之后,yes@Adam you's right,14x14矩阵应该压缩为128位,因此如果我只为每个非零元素使用坐标(行和列),它仍然是160位(因为有20位)。我不是在寻找一个精确的解决方案,而是在寻找一个有用的想法。

只有在拥有分布和表示的情况下,才能谈论压缩内容。这就是你必须发送的字典的问题:你总是需要某种协议字典来解压某些东西。碰巧像
.zip
.mpeg
这样的东西已经有了这些字典/编解码器。即使像哈夫曼编码这样简单的东西也是一种算法;在通信通道的另一端(您可以将压缩视为通信),另一个人已经有了一些代码(字典)来执行哈夫曼解压方案

因此,如果不先考虑“我希望看到什么类型的矩阵?”,“数据是真正随机的,还是有顺序的?”,以及如果是“我如何表示矩阵以利用数据中的顺序?”,就不能开始谈论压缩内容

如果不增加其他对象的大小(至少增加1位),则无法压缩某些矩阵。如果所有矩阵的概率都相等,而您对它们的关注程度也相等,那么这将是一个坏消息

附录:

使用稀疏矩阵机制的答案不一定是正确的答案。例如,在python中,矩阵可以表示为
[[(r+c)%2,表示范围内的c(cols)],表示范围内的r(行)]
(棋盘格模式),稀疏矩阵根本不会压缩它,但矩阵的Kolmogorov复杂性是上述程序的长度


我知道每个矩阵都有相同数量的1,所以这是确定的。我唯一不知道的是1的位置。另外,如果我用字典传输矩阵,并且有突发错误,那么字典可能会受到影响,所以。。。结果信息不会被破坏吗?这就是为什么我尝试使用无损数据压缩,比如运行长度,解码器不需要字典--原创海报

矩阵有多少个1作为其大小的一部分,其大小是多少(
NxN
——什么是
N

此外,这是一个不正确的断言,不应被用作要求运行长度编码(仍然需要程序)的理由;当您通过通道传输数据时,您始终可以为此数据添加纠错功能。“数据”只是一团比特。您可以通过通道传输数据和任何必需的字典。纠错机器根本不关心你传输的比特是用来做什么的

附录2:

(14*14)选择20种可能的安排,我假设是随机选择的。如果这个数字大于
128^2
你想做的是不可能的。幸运的是
log_2((14*14)选择20)~=90位<128位
,所以这是可能的

写下像
32,2,67175,52,…,168这样的20个数字的简单解决方案不起作用,因为
logu2(14*14)*20~=153位>128位
。这相当于运行长度编码。我们想这样做,但我们的预算非常严格,不能“浪费”比特

因为您平等地考虑每种可能性,所以您的“字典”/“程序”将模拟一个巨大的查找表Matlab的稀疏矩阵实现可以工作,但不能保证工作,因此不是正确的解决方案。

如果可以在数字范围
[0,2^128)
和大小为20的子集之间创建一个双射,就可以了。这对应于枚举将金字塔下降到第196行第20个元素的方法。这与枚举所有“k组合”相同。请参阅

幸运的是,我知道Mathematica和Sage以及其他CAS软件显然可以生成“第5个”或“第12个”或任意编号的k子集

然后我们做了更多的搜索,遇到了一些神秘的Fortran代码,比如和

我们可以对它进行反向工程,但它有点密集。但现在我们有足够的信息来搜索
k-子集秩unrank
,这导致我们--参见一节 生成(n-集的)k-子集:词典编纂的 在接下来的几页中,排序“和
排序
取消排序
算法


为了实现精确的理论最优压缩,在1s均匀随机分布的情况下,我们必须使用此技术将矩阵投影到范围的输出数您的输入是稀疏矩阵的完美候选。您说您正在使用Matlab,因此您已经为您构建了一个很好的稀疏矩阵

spm = sparse(dense_matrix)
Matlab的稀疏矩阵实现使用压缩的稀疏列,其内存使用量为
2*(#非零)+(#列)
,这在2的情况下应该非常好
spm = sparse(dense_matrix)