объясните, пожалуйста, что такое матрицы. а то википедия матрицу определила как квадратный array, а array как матрицу (или я просто не понял). хочу понять что такое матрица чтоб понять, почему умножение двух матриц происходит именно таким образом.
(сейчас возможен неадекват: то есть при умножении матриц с размерностями m*n и n*l мы можем представить их как наборы m и l векторов в n-мерном пространстве, тогда результатом перемножения будет [здесь я долго пытался думать] матрица скалярных произведений этих векторов. и тут меня терзает мысль, почему же матрицы перемножаются (или представляются) именно таким образом, что в одной "измерением" служат строки, а в другой — столбцы? ведь умножение происходит именно так (скалярное произведение векторов берется именно так), почему не взять, к примеру, столбцы за измерения и перемножать в матрицах m*n и l*n просто два набора векторов (m и l) в n-мерном пространстве?)
спасибо.
kb
15.09.2011 21:53 Gajim
Do you really want to delete ?
matrix is an oblong arrangement of terms
ок. а причина именно такого их перемножения (и условий для этого)?
есть несколько причин, назову одну: если рассматривать квадратную матрицу как линейный оператор векторного пространства, определённое таким образом умножение будет задавать композицию операторов. а вообще поищи предыдущую фразу в гугле (её автор — Сильвестр, изобретатель матриц), и почитай про детерминанты
ок, спасибо.
http://code.google.com/p/gl33lessons/wik...
почему бы и нет? :-)
// перемножение двух матриц
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];
}
Ну там вроде неплохо разжёвано про row/column majority, если это то что тебя интересовало :)
ээ, ну там в двух абзацах описано, что OpenGL по историческим причинам использует column-major формат. это его дело, он мог бы и вообще формат, описывающий матрицу "змейкой" использовать (кстати, возможно он вполне хорош для часто сужающихся/расширяющихся матриц в обоих направлениях).
или я чего-то не понял?
Ну OpenGL использует более близкий к матану формат.
ну да. вопрос изначальный в том, почему в алгебре изначально матрицы перемножаются именно строки первого на столбцы второго. сути я нифига не понял, но книжки читать был успешно послан.
кстати, комментарий @jtootf из /3 про композицию, кажется, только что догнал (отчасти потому что начал читать Винберга "Курс алгебры").
надеюсь, что обобщение на прямоугольные матрицы было очевидным