Рассмотрим, что у меня две матрицы из 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 cross correlation.
Я делаю эту часть 10M раз. Поэтому загрузка занимает так много времени. Мои матрицы - 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?
Заранее спасибо,
Примечание. Это не ответ, а длинный комментарий. Я отправляю его как ответ, чтобы избежать рассылки комментариев в разделе комментариев.
Хранение 1M элементов числового типа никогда не будет проблемой на любом современном компьютере.
Вы должны узнать немного больше о C и памяти; bool не является элементарным типом, поэтому хранилище bool практически существует. Упаковка несколько битов в гольца является хорошей идеей, но вы должны смотреть на C++ BITSET, если вы хотите быть эффективным.
Поймите, что может существовать существенная разница между тем, как вы храните свои данные на жестком диске, и формат, который лучше всего подходит для обработки активной памяти (например, ОЗУ). Вероятно, это является причиной нечетного размера хранилища Matlab; сохранение дополнительной информации и/или, по-видимому, неэффективных блоков хранения часто является желательным для упрощения написания алгоритмов, а элементарные операции выполняются быстрее на процессоре.
В целом, я думаю, что преимущество перехода на хранилище "bool-упакованных символов", как вы предполагаете, будет незначительным с точки зрения скорости обработки и, безусловно, будет сопряжено с трудной работой по программированию и неясным процессом обслуживания. Вам лучше придерживаться символов для обработки и переключиться на однобитовое хранилище для операций записи на диск.
10^7*25ms = 250000 sec = 4200 min = 70 hrs = 3 days.
Если я могу уменьшить с 25 мс до 3 мс, время загрузки будет9 hrs