kb 15.09.2011 21:53 Gajim

объясните, пожалуйста, что такое матрицы. а то википедия матрицу определила как квадратный array, а array как матрицу (или я просто не понял). хочу понять что такое матрица чтоб понять, почему умножение двух матриц происходит именно таким образом.

(сейчас возможен неадекват: то есть при умножении матриц с размерностями m*n и n*l мы можем представить их как наборы m и l векторов в n-мерном пространстве, тогда результатом перемножения будет [здесь я долго пытался думать] матрица скалярных произведений этих векторов. и тут меня терзает мысль, почему же матрицы перемножаются (или представляются) именно таким образом, что в одной "измерением" служат строки, а в другой — столбцы? ведь умножение происходит именно так (скалярное произведение векторов берется именно так), почему не взять, к примеру, столбцы за измерения и перемножать в матрицах m*n и l*n просто два набора векторов (m и l) в n-мерном пространстве?)

спасибо.

1. jtootf 15.09.2011 23:13

matrix is an oblong arrangement of terms

2. kbjtootf /1 16.09.2011 05:45

ок. а причина именно такого их перемножения (и условий для этого)?

3. jtootfkb /2 16.09.2011 06:25 galois

есть несколько причин, назову одну: если рассматривать квадратную матрицу как линейный оператор векторного пространства, определённое таким образом умножение будет задавать композицию операторов. а вообще поищи предыдущую фразу в гугле (её автор — Сильвестр, изобретатель матриц), и почитай про детерминанты

4. kbjtootf /3 16.09.2011 06:32 Gajim

ок, спасибо.

6. kbdorfe /5 17.09.2011 20:35 Gajim

почему бы и нет? :-)

// перемножение двух матриц
void Matrix4Mul(Matrix4 M, Matrix4 A, Matrix4 B)
{
M[ 0] = A[ 0] * B[ 0] + A[ 1] * B[ 4] + A[ 2] * B[ 8] + A[ 3] * B[12];
M[ 1] = A[ 0] * B[ 1] + A[ 1] * B[ 5] + A[ 2] * B[ 9] + A[ 3] * B[13];
M[ 2] = A[ 0] * B[ 2] + A[ 1] * B[ 6] + A[ 2] * B[10] + A[ 3] * B[14];
M[ 3] = A[ 0] * B[ 3] + A[ 1] * B[ 7] + A[ 2] * B[11] + A[ 3] * B[15];
M[ 4] = A[ 4] * B[ 0] + A[ 5] * B[ 4] + A[ 6] * B[ 8] + A[ 7] * B[12];
M[ 5] = A[ 4] * B[ 1] + A[ 5] * B[ 5] + A[ 6] * B[ 9] + A[ 7] * B[13];
M[ 6] = A[ 4] * B[ 2] + A[ 5] * B[ 6] + A[ 6] * B[10] + A[ 7] * B[14];
M[ 7] = A[ 4] * B[ 3] + A[ 5] * B[ 7] + A[ 6] * B[11] + A[ 7] * B[15];
M[ 8] = A[ 8] * B[ 0] + A[ 9] * B[ 4] + A[10] * B[ 8] + A[11] * B[12];
M[ 9] = A[ 8] * B[ 1] + A[ 9] * B[ 5] + A[10] * B[ 9] + A[11] * B[13];
M[10] = A[ 8] * B[ 2] + A[ 9] * B[ 6] + A[10] * B[10] + A[11] * B[14];
M[11] = A[ 8] * B[ 3] + A[ 9] * B[ 7] + A[10] * B[11] + A[11] * B[15];
M[12] = A[12] * B[ 0] + A[13] * B[ 4] + A[14] * B[ 8] + A[15] * B[12];
M[13] = A[12] * B[ 1] + A[13] * B[ 5] + A[14] * B[ 9] + A[15] * B[13];
M[14] = A[12] * B[ 2] + A[13] * B[ 6] + A[14] * B[10] + A[15] * B[14];
M[15] = A[12] * B[ 3] + A[13] * B[ 7] + A[14] * B[11] + A[15] * B[15];
}

7. dorfekb /6 17.09.2011 21:13

Ну там вроде неплохо разжёвано про row/column majority, если это то что тебя интересовало :)

8. kbdorfe /7 17.09.2011 21:26 Gajim

ээ, ну там в двух абзацах описано, что OpenGL по историческим причинам использует column-major формат. это его дело, он мог бы и вообще формат, описывающий матрицу "змейкой" использовать (кстати, возможно он вполне хорош для часто сужающихся/расширяющихся матриц в обоих направлениях).

или я чего-то не понял?

9. dorfekb /8 17.09.2011 21:28

Ну OpenGL использует более близкий к матану формат.

10. kbdorfe /9 17.09.2011 21:32 Gajim

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

кстати, комментарий @jtootf из /3 про композицию, кажется, только что догнал (отчасти потому что начал читать Винберга "Курс алгебры").

11. jtootfkb /4 07.10.2011 20:50

надеюсь, что обобщение на прямоугольные матрицы было очевидным

Do you really want to delete ?