Как работает матричное деление GNU Octave? Получение неожиданного поведения.

Как работает матричное деление в GNU Octave?

Вместо того, чтобы делать

1./[1;1]

я случайно сделал

1/[1;1]

К моему удивлению, это дает:

[0.5, 0.5]

Поперечный случай:

1/[1,1]

дает ожидаемое:

error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)

Может ли кто-нибудь объяснить результат [0,5, 0,5]?


person eyaler    schedule 04.09.2012    source источник


Ответы (3)


это ответ, который я получил от Алана Боултона на форуме обсуждения курса машинного обучения Coursera:

Суть идеи в том, что x/y определяется достаточно широко, чтобы можно было работать с матрицами. Концептуально оператор / пытается вернуть x∗y−1 (или x * inv(y) на языке Octave), как в следующем примере:

octave:1> eye(2)/[1 2;3 4]
ans =
  -2.00000   1.00000
   1.50000  -0.50000

octave:2> inv([1 2;3 4])
ans =
  -2.00000   1.00000
   1.50000  -0.50000

Хитрость возникает, когда y является вектор-столбцом, и в этом случае inv(y) не определено, поэтому используется pinv(y), псевдоинверсия y.

octave:1> pinv([1;2])
ans =
   0.20000   0.40000

octave:2> 1/[1;2]
ans =
   0.20000   0.40000

Вектор y должен быть совместим с x, чтобы x * pinv(y) был корректно определен. Так что все в порядке, если y является вектором-строкой, если x совместим. См. следующую сессию Octave для иллюстрации:

octave:18> pinv([1 2])
ans =
   0.20000
   0.40000

octave:19> 1/[1 2]
error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)
octave:19> eye(2)/[1 2]
ans =
   0.20000
   0.40000

octave:20> eye(2)/[1;2]
error: operator /: nonconformant arguments (op1 is 2x2, op2 is 2x1)
octave:20> 1/[1;2]
ans =
   0.20000   0.40000
person eyaler    schedule 05.09.2012

Рассмотрим следующий пример:

>> A = [5 10];

>> B = [2 2];

Если вы хотите поэлементное деление, используйте A ./ B с равным размером матрицы обоих элементов, т.е. если A имеет размер m∗n, B должен иметь размер m∗n

>> A ./B
ans =

    2.5000   5.0000

Если вам нужно матричное деление, используйте A/B с размером матрицы элемента A как m∗n и B как q∗n или m∗n. Оператор / пытается вернуть x∗y−1 (т. е. x * pinv(y) в октавном формате).

>> A / B
ans =  3.7500

что такое же, как

>> A * pinv(B)
ans =  3.7500

Функция pinv() в OCTAVE/MATLAB возвращает псевдообратную матрицу Мура-Пенроуза, тогда как функция inv() возвращает обратную матрицу. Если вы не знаете, что использовать, используйте pinv(). answer/Shraman-Bhaduri?srid=k0tQ" rel="nofollow noreferrer">В чем разница между pinv и inv?

person Akash    schedule 03.04.2017

Разделение матрицы с Октавой объяснил:

Формальное описание Octave Matrix Division отсюда

http://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html

x / y
    Right division. This is conceptually equivalent to the expression
    (inverse (y') * x')'

    But it is computed without forming the inverse of y'.

    If the system is not square, or if the coefficient matrix is 
    singular, a minimum norm solution is computed. 

Это означает, что эти два значения должны быть одинаковыми:

[3 4]/[4 5; 6 7]
ans =
   1.50000  -0.50000

(inverse([4 5; 6 7]') * [3 4]')'
ans =
   1.50000  -0.50000

Во-первых, поймите, что деление октавной матрицы не является коммутативным, так же как умножение матриц не является коммутативным.

Это означает, что A / B не равно B / A

1/[1;1]
ans =
   0.50000   0.50000

[1;1]/1
ans =
   1
   1

Один, разделенный на матрицу с одним значением, равен единице:

1/[1]
ans = 1

Один, разделенный на матрицу с единственным значением три, равен 0,33333:

1/[3]
ans = .33333

Один, разделенный на матрицу (1 x 2):

1/[1;1]
ans =
   0.50000   0.50000

Equivalent:

([1/2;1/2] * 1)'
ans =
   0.50000   0.50000

Обратите внимание, что, как сказано в инструкции, мы берем норму вектора. Итак, вы видите, как [1;1] превратилось в [1/2; 1/2]. «2» исходит из длины вектора, 1 исходит из предоставленного вектора. Сделаем еще:

Один, разделенный на матрицу (1 x 3):

1/[1;1;1]
ans = 
    0.33333   0.33333   0.33333   

Эквивалент:

 ([1/3;1/3;1/3] * 1)'
 ans =
    0.33333   0.33333   0.33333

Что делать, если один из элементов отрицательный...

1/[1;1;-1]
ans =
    0.33333   0.33333  -0.33333

Эквивалент:

([1/3;1/3;-1/3] * 1)'
ans =
   0.33333   0.33333  -0.33333

Итак, теперь у вас есть общее представление о том, что делает Octave, когда вы не предоставляете ему квадратную матрицу. Чтобы понять, что делает деление матрицы Octave, когда вы передаете ему квадратную матрицу, вам нужно понять, что делает обратная функция.

Я нормализовал ваши векторы вручную, если вы хотите, чтобы октава делала их, вы можете добавить пакеты для этого, я думаю, что следующий пакет будет делать то, что я делал с нормализацией векторов:

http://octave.sourceforge.net/geometry/function/normalizeVector.html

Итак, теперь вы можете преобразовать деление в эквивалентное умножение. Прочтите эту статью о том, как работает матричное умножение, и вы сможете вернуться назад и выяснить, что происходит под капотом матричного деления.

http://www.purplemath.com/modules/mtrxmult2.htm

person Eric Leschinski    schedule 04.09.2012