Lame question about matrices

Started by
3 comments, last by gameovercl 22 years, 8 months ago
Hi there! I have to multiply two 4x4 matrices stored as an 1D array of 16 floats. I know that OpenGL has functions to multiply matrices, but I would like to see some code to do this task... So, if you know how to do it, please post the code here By the way... remember that OpenGL uses column-major matrices (anyway, I''m using an array such as GLfloat matrix[16]; ) Thanks in advance! Cristián Ramírez (gameovercl) ICQ #38991565 Viña del Mar CHILE
Advertisement
Hello,

it was just a quick think, but it should be right.
If you use a column major Matrix use:
int i,j,k;GLfloat[16] m1, m2; // the matrices to multiplyGLfloat[16] resultMatrix={0} // initialize everything with 0for (i=0; i<4;++1)  for (j=0; j<16; j+=4)    for (k=0; k<4; ++k)      resultMatrix[i+j] += m1[i+k*4]*m2[j+k];

It is easy to generalize it to any matrix multiplication.
Remember that this is not optimized (e.g. <<2 would be faster as *4 but that should be recognized by the compiler). So whenever possible use the prebuild OpenGL functions, or matrics multiplication of optimized math libs.

Greetings Ben
have a search for the ''matrice + quaternion faq'' lots of good stuff there
I won''t implement it code-wise, but it''s easier to see it this way.

Say you have two matrices of size n-by-n, as such:

  [A(1,1)  A(1,2)  ...  A(1,n)]     [B(1,1)  B(1,2)  ...  B(1,n)][A(2,1)  A(2,2)  ...  A(2,n)]  *  [B(2,1)  B(2,2)  ...  B(2,n)][ ...     ...    ...   ...  ]     [ ...     ...    ...   ...  ][A(n,1)  A(n,2)  ...  A(n,n)]     [B(n,1)  B(n,2)  ...  B(n,n)]  


The product of these two matrices will also be an n-by-n matrix (let''s call it R) where the value the value each cell (i,j) (for i and j integers between 1 and n) is given by the following property:

R(i,j) = A(i,1)*B(1,j) + A(i,2)*B(2,j) + A(i,3)*B(3,j) + ... + A(i,n)*B(n,j)

If you know anything about dot products of vectors, it''s just like calculating the dot product of A''s ith row and B''s jth column.

Now granted, I used double-indeces on mine and didn''t use the number 0 for ease of use. So yours will look something like Ben''s up yonder. However, this is the theory behind the code.

~ Dragonus
If you are coding it (I.E. the X86 processor is going to be doing the calculations) then it will be faster to use double indecies. In memorey they are stored as a single column, and the forumlae so faithfully typed out above would be done in realtime using a pipeline that calculates memorey offsets on X86 archietectures, instead of using the ALU and waiting for two cycles to complete the addition and multiplication for you.

This topic is closed to new replies.

Advertisement