Алгоритм Python Strassen получает ошибку при объединенииPython

Программы на Python
Ответить
Anonymous
 Алгоритм Python Strassen получает ошибку при объединении

Сообщение Anonymous »


Я взял пример Штрассена из: https://www.geeksforgeeks.org/strassens ... plication/ Если размер матрицы нечетный, я заполняю ее 1 строкой и 1 столбцом с нулями. Я получаю эту ошибку для матриц 5x5, которые код превращает в 6x6, дополненную нулями:

Traceback (самый последний вызов — последний): Файл «/home/surfacepro/Downloads/strassen.py», строка 82, в основной() Файл "/home/surfacepro/Downloads/strassen.py", строка 77, в основном файле. print(strassen(матрицаA, матрицаB)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Файл «/home/surfacepro/Downloads/strassen.py», строка 33, в штрассене p1 = штрассен(a, f - h) ^^^^^^^^^^^^^^^^^^^ Файл "/home/surfacepro/Downloads/strassen.py", строка 35, в штрассене p3 = штрассен(c + d, e) ^^^^^^^^^^^^^^^^^^^ Файл "/home/surfacepro/Downloads/strassen.py", строка 49, в штрассене. c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22)))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^ Файл "/usr/lib64/python3.11/site-packages/numpy/core/shape_base.py", строка 289, в vstack return _nx.concatenate(arrs, 0, dtype=dtype, casting=casting) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ValueError: все измерения входного массива, за исключением оси конкатенации, должны точно совпадать, но по измерению 1 массив с индексом 0 имеет размер 1, а массив с индексом 1 имеет размер 0. matrix_A.txt: https://pastebin.com/9vMKEjJd

matrix_B.txt: https://pastebin.com/F7Xs4Ciz
# Версия 3.6 импортировать numpy как np импортировать повторно, математика определение разделения (матрица): """ Разбивает данную матрицу на четверти. Вход: матрица n1 xn Выходные данные: кортеж, содержащий 4 матрицы n/2 x n/2, соответствующие a, b, c, d. """ строка, столбец = матрица.форма строка2, столбец2 = строка//2, столбец//2 вернуть матрицу[:row2, :col2], матрицу[:row2, col2:], матрицу[row2:, :col2], матрицу[row2:, col2:] защита Штрассен (х, у): """ Вычисляет матричное произведение рекурсивно по принципу «разделяй и властвуй». Входные данные: матрицы nxn x и y. Выходные данные: матрица nxn, произведение x и y. """ # Базовый случай, когда размер матриц равен 1x1 если лен(х) == 1: вернуть х * у # Разбиение матриц на квадранты. Это будет сделано рекурсивно # пока не будет достигнут базовый случай. а, б, с, d = разделение (х) е, f, g, h = расщепление (y) # Рекурсивное вычисление 7 произведений (p1, p2...p7) p1 = штрассен(a, f - h) p2 = штрассен(a + b, h) p3 = штрассен(c + d, e) p4 = штрассен(d, g - e) p5 = штрассен(a + d, e + h) p6 = штрассен(b - d, g + h) p7 = штрассен(а - с, е + f) # Вычисление значений 4 квадрантов итоговой матрицы c с11 = р5 + р4 — р2 + р6 с12 = р1 + р2 с21 = р3 + р4 с22 = р1 + р5 – р3 – р7 # Объединение 4 квадрантов в одну матрицу путем укладки по горизонтали и вертикали. c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22)))) вернуть с защита основного(): с open('matrix_A.txt', 'r') как f: плоскаяМатрица = f.read() с open('matrix_B.txt', 'r') как f: FlatMatrix2 = f.read() числа = re.compile("-?\d+") результат = список (карта (int, Numbers.findall (плоская матрица))) результат2 = список(карта(int, Numbers.findall(квартираMatrix2))) Matrix_dimension = int(math.sqrt(len(результат))) матрицаA = np.array(результат).reshape(matrix_dimension, matrix_dimension) матрицаB = np.array(result2).reshape(matrix_dimension, matrix_dimension) если array_dimension % 2 != 0: матрица_размерность = матрица_размерность + 1 матрицаA = np.pad(матрицаA, [(0, 1), (0, 1)], режим = 'константа', константные_значения = 0) матрицаB = np.pad(matrixB, [(0, 1), (0, 1)], mode='constant', Constant_values=0) печать (матрица А) печать (матрица B) print(strassen(матрицаA, матрицаB)) print("Сумма: ", strassen(матрицаA, матрицаB).sum()) если __name__ == '__main__': основной()
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»