7

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

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

c=a.'/b

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

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

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

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

  • 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

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Я думаю, что у вас есть опечатка. Если & quot; a & quot; 1 на 18, транспонирование не требуется.

    от gnovice
  • Хорошо, извините за это, это сначала 18x1.

    от EmilyS
  • Да, A-транспонирование / B должно произойти правильно, A-транспонирование и B должны иметь одинаковое нет. колонн. Итак, размер A должен быть 18x1, как указано в gnovice.

    от Suvesh Pratapa
  • @ Эмили: Тогда & quot; а & quot; должно быть 18 на 1 (до транспонирования), а не 1 на 18. В противном случае MATLAB выдает ошибку.

    от gnovice
  • Это не опечатка, код Matlab работает отлично.

    от EmilyS
5 ответов
  • 7

    Линия c = a.' / b

    Линия

    c = a.' / b
    

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

    c = numpy.linalg.lstsq(b.T, a.T)[0].T
    

  • 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
    

  • 5

    В Matlab

    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 :)

  • 7

    Символ B/A = (A'\B')'

    Символ/ является оператором матричного правого деления в 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.

  • 1

    Вы также можете подойти к этому с помощью псевдообратного

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

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