- отредактирован УДОВЛЕТВОРИТЬ НИЖЕ COMMENT/DOWNVOTER -
Вы спрашиваете, как умножать матрицы легко и быстро.
РЕШЕНИЕ 1: Это решаемая проблема: используйте numpy. Все эти операции легки в numpy, и поскольку они реализованы на C, они довольно быстро развиваются.
также смотрите:
SciPy и Numpy имеют разреженные матрицы и умножение матрицы. Он не использует много памяти, поскольку (по крайней мере, если я написал его на языке C), он, вероятно, использует связанные списки и, следовательно, будет использовать только память, необходимую для суммы данных, а также некоторые накладные расходы. И это почти наверняка будет невероятно быстрым по сравнению с чистым решением python.
РЕШЕНИЕ 2
Другой ответ здесь предполагает хранение значений в качестве кортежей (х, у), предполагая значение ЛОЖЬ, если оно не существует, то это правда.Альтернативой этому является числовая матрица с (x, y, value) кортежами.
НЕЗАВИСИМО: Умножив это будет Настя времени мудро: найти один элемент, решить, какой другой элемент массива, чтобы умножить, а затем искать весь набор данных для этого конкретного кортежа, и если он существует, умножать и вставить результат в матрицу результатов.
РЕШЕНИЕ 3 (PREFERRED против решения 2, ИМХО)
Я предпочел бы это, потому что это проще/быстрее.
Представьте свою разреженную матрицу с набором словарей. Матрица представляет собой один ДИКТ с элементом в точке (х, у) и значение (об существа с x1, y1, x2, y2 и т.д.):
matrixDictOne = { 'x1:y1' : v1, 'x2:y2': v2, ... }
matrixDictTwo = { 'x1:y1' : v1, 'x2:y2': v2, ... }
Поскольку Python ДИКТ поиска является O (1) (хорошо, на самом деле, вероятно, ближе к log (n)), это быстро. Это не требует поиска всех данных второй матрицы для присутствия элемента перед умножением. Итак, это быстро. Легко написать многократно и легко понять представления.
РЕШЕНИЕ 4 (если вы мазохист)
код это решение с помощью отображенного в память файла требуемого размера. Инициализируйте файл с нулевыми значениями требуемого размера. Вычислите смещения самостоятельно и напишите в соответствующие места в файле, как вы делаете умножение. Linux имеет VMM, который будет загружаться и выходить за вас с небольшими накладными расходами или работать с вашей стороны. Это решение для очень, очень больших матриц, которые НЕ SPARSE и, следовательно, не поместится в памяти.
Примечание: решает жалобу нижнего подателя жалобы, что она не поместится в памяти. Тем не менее, OP действительно сказал редкий, что подразумевает очень мало фактических данных, распространенных в гигантских массивах, и Numpy/SciPy обрабатывают это изначально и, следовательно, красиво (много людей в Fermilab регулярно используют Numpy/SciPy, я уверен, что редкий матричный код хорошо протестирован).
Вы умножаете их как булевы, то есть результат булевого типа? и насколько разрежены ваши данные, какие% из них? – alko
Да, я умножаю их на boolean с 0, 1s, следовательно, получаю числа в результирующей матрице 0 или целых чисел больше 0. Как проверить разреженность моих матриц? – user7289
вы сгенерировали их, вы можете узнать из алгоритма. Вы можете проверить количество единиц с 'sum()' и делить на общий размер (6.4 * 10 ** 9 в вашем случае) – alko