Вопрос по matlab, python, linear-algebra, numpy – Деление массива - перевод с MATLAB на Python

7

У меня есть эта строка кода в MATLAB, написанная кем-то еще:

<code>c=a.'/b
</code>

Мне нужно перевести его на Python. a, b и c - все массивы. Размеры, которые я сейчас использую для тестирования кода:

а: 18х1,
б: 25х18,

что дает мне с размерами 1x25.

Массивы не квадратные, но я бы не хотел, чтобы код не работал, если бы они были. Может кто-нибудь объяснить, что именно делает эта строка (математически) и как это сделать в Python? (то есть эквивалент для встроенной функции mrdivide в MATLAB, если она существует в Python?)

Это не опечатка, код Matlab работает отлично. EmilyS
Я думаю, что у вас есть опечатка. Если & quot; a & quot; 1 на 18, транспонирование не требуется. gnovice
Хорошо, извините за это, это сначала 18x1. EmilyS
@ Эмили: Тогда & quot; а & quot; должно быть 18 на 1 (до транспонирования), а не 1 на 18. В противном случае MATLAB выдает ошибку. gnovice
Да, A-транспонирование / B должно произойти правильно, A-транспонирование и B должны иметь одинаковое нет. колонн. Итак, размер A должен быть 18x1, как указано в gnovice. Suvesh Pratapa

Ваш Ответ

5   ответов
1

Вы также можете подойти к этому с помощью псевдообратногоB затем запишите умножение этого результата наA, Попробуйте использоватьnumpy.linalg.pinv затем объединить это с умножением матрицы черезnumpy.dot:

c = numpy.dot(a, numpy.linalg.pinv(b))
7

Символ/ является оператором матричного правого деления в MATLAB, который вызываетmrdivide функция. Из документации, матрица правого деления связана сматричное левое деление следующим образом:

B/A = (A'\B')'

ЕслиA квадратная матрица,B/A примерно равноB*inv(A) (хотя это вычисляется другим, более надежным способом). Иначе,x = B/A является решением в смысле наименьших квадратов недооцененной или переопределенной системы уравненийx*A = B, Более подробно об алгоритмах, используемых для решения системы уравнений, даетсяВот, Обычно пакеты какLAPACK или жеBLAS используются под капотом.

Пакет NumPy для Python содержит подпрограммуlstsq для вычисления решения методом наименьших квадратов для системы уравнений. Эта процедура, скорее всего, даст вам сопоставимые результаты с использованиемmrdivide функция в MATLAB, но вряд лиexact, Любые различия в базовых алгоритмах, используемых каждой функцией, вероятно, приведут к ответам, которые немного отличаются друг от друга (то есть один может возвращать значение 1,0, тогда как другой может возвращать значение 0,999). Относительный размер этой ошибкиcould в конечном итоге будет больше, в значительной степени зависит от конкретной системы уравнений, которую вы решаете.

ИспользоватьlstsqВам, возможно, придется немного скорректировать свою проблему. Похоже, что вы хотите решить уравнение видаcB = a, гдеB 25х18,a 1 на 18, иc 1 на 25. Применяятранспонировать в обе стороны дает вам уравнениеBTcT = aT, которая является более стандартной формой (т.е.Ax = b). Аргументы в пользуlstsq должно быть (в этом порядке)BT (массив 18 на 25) иaT (массив из 18 элементов).lstsq должен вернуть массив из 25 элементов (cT).

Note: while NumPy doesn't make any distinction between a 1-by-N or N-by-1 array, MATLAB certainly does, and will yell at you if you don't use the proper one.

Error: User Rate Limit Exceeded
1

[отредактировано] Как указывал Сувеш, раньше я был совершенно неправ. NumPy все еще может легко сделать процедуру, которую он дает в своем посте:

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded EmilyS
Error: User Rate Limit Exceeded
7

Линия

c = a.' / b

вычисляет решение уравненияc b = aT заc, У Numpy нет оператора, который делает это напрямую. Вместо этого вы должны решитьbT cT = a заcT и транспонировать результат:

c = numpy.linalg.lstsq(b.T, a.T)[0].T
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
5

A.' означает транспонирование матрицы. Математически, то, что достигается в коде, этоT/ В.

How to go about implementing matrix division in Python (or any language) (Note: Let's go over a simple division of the form A/B; for your example you would need to do AT first and then AT/B next, and it's pretty easy to do the transpose operation in Python |left-as-an-exercise :)|)

У вас есть матричное уравнение C * B = A (Вы хотите найти C как A / B)

ПРАВОЕ РАЗДЕЛЕНИЕ (/) выглядит следующим образом:

С**ВT) = А*ВT

Затем вы изолируете C путем инвертирования (B*ВT)

т.е.

C = A*ВT**ВT) & APOS; ----- [1]

Поэтому для реализации матричного деления в Python (или любом другом языке) получите следующие три метода.

Matrix multiplication Matrix transpose Matrix inverse

Затем примените их итеративно для достижения деления, как в [1].

Только вам нужно сделатьT/ B, поэтому ваша последняя операция после реализации трех основных методов должна быть:

T*ВT**ВT) & APOS;

Note: Don't forget the basic rules of operator precedence :)

Похожие вопросы