2013-05-05 2 views
0

У меня есть матрица 1200x130 0-1, а некоторые строки идентичны (4 из одной строки, 8 из другой и т. Д.). Я пытаюсь найти эффективный способ присвоения одинаковых идентификаторов одинаковым строкам.Присвоение идентификатора идентичным строкам в двоичной матрице

Вот что я пробовал в Excel: Для каждой строки я умножил запись k-го столбца на 2^k и суммировал по всем столбцам. Теоретически, для каждой другой строки это должно дать мне уникальный идентификатор, но цифры получаются очень большими. Excel испортил сравнение для этих чисел. (Я думаю, это потому, что он хранит их как 3.234023490249 x 10^246 до определенной цифры и игнорирует оставшиеся цифры.)

Итак, я решил использовать VBA, но единственный способ, которым я могу думать, - это попарное сравнение для все строки и столбцы. Я считаю, что должны быть более эффективные способы справиться с этим. Любые рекомендации?

(Я не ищу для конкретного решения Excel или VBA. Любая рекомендация поможет.)

Спасибо заранее.

+0

Я не уверен, что вы подразумеваете под * «умножил запись k-го столбца на 2^k и суммировали по всем столбцам» *. Можете ли вы рассказать об этом немного больше для меня? – glh

+0

В качестве отступления каждый номер строки является уникальным, и в тех случаях, когда мне нужно уникальное число, я добавляю ему 'row_nbr/1000'. – glh

+0

Для строки что-то вроде этого: 1 0 0 1 0 1, я делаю это: 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4 + 0 * 2^5 + 1 * 2^6 ... Когда у меня небольшое количество столбцов, оно работает хорошо, но для этого случая это не так. – stgath

ответ

0

Вы преобразовываете двоичный код в десятичный. Это действительно огромное количество. A long целое число в языке программы - это 64-разрядное число. Таким образом, ваш 130 бит тоже переполнит его.

Вы можете использовать комбинированный идентификатор, ограничивающий каждый из них максимальным длинным целочисленным значением. Для 130 бит, минимум 3 длинных целых числа в строке.

Для каждой строки должно быть 3 идентификатора. Скажем, первый идентификатор принимает первые 40 бит. вторых ID принимают цифры от 41 до 80. Третьего ID принимает цифры от 81 до 130.

Comparson потребовал бы всех 3 идентификаторов могут быть одинаковыми, чтобы вернуть equal ID.


Вы также можете использовать строки.

Используя шестнадцатеричный (по одному символу для каждого из четырех двоичных цифр), вы должны иметь 130/4 = 33 символов.

Возможно, если вы попробуете 32 базовый номер, это даст 130/5 = 26 символов. Каждые 5 бит соответствуют символу от 0, 1, 2, ..., 8, 9, A, B, ..., U, V.

Или просто простая строка из 132 символов, содержащая все ваши биты.

Смежные вопросы