Предположим, у меня есть две матрицы 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.
Я делаю эту часть 10 миллионов раз. Поэтому загрузка занимает так много времени. Мои матрицы 1K * 1K, поэтому я могу хранить их как 1 МБ, но я хочу, чтобы они были 128 КБ (Matlab хранит примерно 178 КБ).
Вот мой вопрос: я хочу хранить свои матрицы как 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?
Заранее спасибо,
Замечания: Это не ответ, а скорее длинный комментарий. Я выкладываю это как ответ, чтобы избежать спама в разделе комментариев OP.
Хранение элементов 1M числового типа никогда не будет проблемой на любом современном компьютере.
Вы должны узнать немного больше о C и памяти; bool не элементарный тип, поэтому хранение bool существует только виртуально. Упаковка нескольких битов в char — это хорошая идея, но вы должны взглянуть на C ++. BitSet если вы хотите быть эффективным.
Поймите, что может существовать существенная разница между способом хранения данных на жестком диске и форматом, который лучше всего подходит для обработки активной памяти (например, ОЗУ). Это, вероятно, причина нечетного размера хранилища Matlab; хранение дополнительной информации и / или, казалось бы, неэффективных блоков хранения часто желательно, чтобы облегчить написание алгоритмов, а элементарные операции выполняются быстрее на CPU.
В целом, я думаю, что преимущество перехода к хранилищу типа «bool-набитые символы», которое вы предлагаете, будет незначительным с точки зрения скорости обработки и, безусловно, повлечет за собой сложную работу по программированию и затеняет процесс обслуживания. Вам лучше придерживаться символов для обработки и переключаться на однобитное хранилище для операций записи на диск.