У меня есть вектор X
который я создал так:Как заменить диагональные элементы матрицы вектором в SymPy?
from sympy import *
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
X = Matrix([x1, x2, x3])
Тогда у меня есть матрица myMat
, которая содержит только те:
myMat = ones(3, 3)
Matrix([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
Теперь я хотел бы заменить диагонали матрицы по моему вектору X
; мой желаемый результат выглядит следующим образом:
Matrix([
[x1, 1, 1],
[1, x2, 1],
[1, 1, x3]])
Я могу, конечно, сделать это в for-loop
, как это:
for ind, el in enumerate(X):
myMat[ind, ind] = el
но мне интересно, есть ли умнее способ сделать это с помощью прямого доступа к диагональю этой матрицы. Хотя я могу вычислить матрицу trace
, я не смог найти способ заменить только диагональные элементы, используя что-то вроде myMat.diag = X
. Есть ли способ сделать это?
EDIT
@Emilien меня на правильном пути, и поэтому я принял этот ответ. На основе этого ответа, я отправил свое собственное решение, которое делает использование sympy
и numpy
и решает проблему в одной строке: my answer
Это выглядит хорошо, спасибо (я тоже его возвышаю). Есть ли какой-либо путь, что один вектор X непосредственно переходит в функцию diag? Я имею дело с гораздо большими векторами, и поэтому было бы больно печатать его так. Тогда вопрос также должен был бы заменить диагональные элементы, если в матрице есть другие значения, чем единицы. Есть идеи? – Cleb
Если у вас нет только «1» по диагонали, вы можете выполнять умножение по счету с обратной матрицей «глаз» («0» по диагонали и «1» где бы то ни было). – Mathiou
Да, это называется распаковкой кортежа. Кроме того, я нашел решение, если вы хотите сохранить исходные значения (не особенно). Я не мог понять, как «передать» случай, когда «i! = J» в лямбда-функции, что опять-таки не может быть суперэффективным по сравнению с циклом for. – Emilien