考虑我有两个矩阵1和0。我希望将其保存为bool Matrix
,但opencv
不会以这种方式存储,而是将其存储为uchar Mat
。因此我的空间增加了8倍。 (每个元素是8位而不是1位)。
我的代码基本如下:
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(matlab存储大约为178 KB)。
以下是我的问题:我想将我的矩阵存储为string
而不是Mat
操作,我想使用字符串。
例如,mat1 and mat2
的尺寸为 2 * 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=By
和str2=Cz
有没有办法交叉关联str1,str2?
提前致谢,
答案 0 :(得分:0)
注意:这不是一个答案,而是一个长评论。我发布它作为答案,以避免垃圾邮件发送OP的评论部分。
在任何现代计算机上存储数字类型的1M元素永远不会成为问题。
你应该多学习一下C和内存存储; bool不是元素类型,因此bool存储只是虚拟存在。将几个位打包成char是一个好主意,但如果你想要高效,你应该看看C ++的bitset。
了解在硬盘上存储数据的方式与最适合处理活动内存(例如RAM)的格式之间可能存在显着差异。这可能是Matlab存储奇怪尺寸背后的原因;通常需要存储附加信息和/或看似低效的存储单元,以使算法更容易编写,并且基本操作在CPU上执行得更快。
总的来说,我认为切换到" bool-packed chars"像你建议的存储在处理速度方面可以忽略不计,并且肯定会导致编程工作困难并且模糊维护过程。您最好坚持使用字符进行处理,并切换到单点存储以进行磁盘写入操作。