2014-09-04 106 views
0

考虑我有两个1和0的矩阵。我想将其保存为bool Matrix,但opencv不会以该方式存储,而是将其存储为uchar Mat。所以我的空间增加了8倍。 (每个元素是8位而不是1位)。C++中两个字符串的互相关

我的代码基本如下:

Mat mat1, mat2; //I want each index to be 1 bit 
load(mat1);  //data size is not important in memory 
load(mat2); 
corr2(mat1, mat2); //this corr2 is same as Matlab's cross correlation. 

我在做这部分10M倍。因此加载需要很多时间。我的矩阵是1K * 1K,所以我可以将它们存储为1 MB,但我希望它们是128 KB(大约178 KB的matlab存储)。

这里是我的问题:我想存储我的矩阵为string而不是Mat操作,我想使用字符串。

例如,尺寸mat1 and mat22 * 8

MAT1:

0 1 0 0 0 0 1 0 (66=B) 
0 1 1 1 0 1 1 1 (122=y) 

MAT2:

0 1 0 0 0 0 1 1 (67=C) 
0 1 1 1 1 0 0 0 (122=z) 

我将存储str1=Bystr2=Cz

有没有办法穿越归属关系STR1,STR2?

由于提前,

回答

0

注:这不是一个答案,而是一个长注释。我将它作为答案发布,以避免垃圾邮件发表评论的评论部分。

存储1M数字类型的元素永远不会是任何现代计算机上的问题。

您应该多学习一些关于C和内存存储的知识; bool不是基本类型,因此布尔存储实际上只存在。将几个比特填充到字符中是一个好主意,但如果要提高效率,您应该查看C++的bitset

了解在硬盘上存储数据的方式和最适合处理活动内存(例如RAM)的格式之间可能存在显着差异。这可能是Matlab存储奇数大小背后的原因;通常需要存储附加信息和/或以看起来效率低下的存储单元来使算法更容易编写,并且基本操作在CPU上执行得更快。总体而言,我认为像您所建议的那样切换到“bool-packed chars”存储的优势在处理速度方面可以忽略不计,并且肯定会招致艰难的编程工作,并且使维护流程变得模糊不清。您最好坚持使用字符进行处理,并切换到单位存储以进行磁盘写入操作。

+0

如果你正在做这个操作10百万次,那是一个非常大的问题。每次加载操作需要20-30毫秒'10^7 * 25ms = 250000秒= 4200分钟= 70小时= 3天。'如果我可以从25毫秒减少到3毫秒,加载时间将是'9小时' – smttsp 2014-09-04 11:12:02

+0

什么阻止你批量加载矩阵?装载1GB内存的缓存系统完全可以接受;那将是你的矩阵的1M。重复的结果存储,它仍然没问题。磁盘操作上的10个大型读/写操作可用于处理该大小:) – Sheljohn 2014-09-04 11:12:44

+0

1GB内存只能加载1024(1K)个文件而不是1M个文件。即使我一次可以加载1M个文件,我仍然可以加载1TB。为什么我应该加载1TB而不是'1TB/8'?我误解了你的意思吗? – smttsp 2014-09-04 11:20:48