взаимная корреляция двух строк в с ++

0

Рассмотрим, что у меня две матрицы из 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?

Заранее спасибо,

Теги:
opencv
matrix
cross-correlation

1 ответ

0

Примечание. Это не ответ, а длинный комментарий. Я отправляю его как ответ, чтобы избежать рассылки комментариев в разделе комментариев.

Хранение 1M элементов числового типа никогда не будет проблемой на любом современном компьютере.

Вы должны узнать немного больше о C и памяти; bool не является элементарным типом, поэтому хранилище bool практически существует. Упаковка несколько битов в гольца является хорошей идеей, но вы должны смотреть на C++ BITSET, если вы хотите быть эффективным.

Поймите, что может существовать существенная разница между тем, как вы храните свои данные на жестком диске, и формат, который лучше всего подходит для обработки активной памяти (например, ОЗУ). Вероятно, это является причиной нечетного размера хранилища Matlab; сохранение дополнительной информации и/или, по-видимому, неэффективных блоков хранения часто является желательным для упрощения написания алгоритмов, а элементарные операции выполняются быстрее на процессоре.

В целом, я думаю, что преимущество перехода на хранилище "bool-упакованных символов", как вы предполагаете, будет незначительным с точки зрения скорости обработки и, безусловно, будет сопряжено с трудной работой по программированию и неясным процессом обслуживания. Вам лучше придерживаться символов для обработки и переключиться на однобитовое хранилище для операций записи на диск.

  • 0
    если вы выполняете эту операцию 10 миллионов раз, это действительно большая проблема. Каждая операция загрузки занимает 20-30 мс 10^7*25ms = 250000 sec = 4200 min = 70 hrs = 3 days. Если я могу уменьшить с 25 мс до 3 мс, время загрузки будет 9 hrs
  • 0
    Что мешает вам загружать матрицы в пакетном режиме? Система кеша, загружающая 1 ГБ памяти одновременно, вполне приемлема; это будет 1М ваших матриц. Дублируйте это для хранения результатов, и это все еще хорошо. 10 больших операций чтения / записи на диске для обработки такого размера тоже приемлемы :)
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню