对OpenGL列主序的说明

<<OpenGL超级宝典>>指出,opengl的矩阵都是列主序。列主序的矩阵排布如下图:


但我们知道,C语言是行主序的。且OpenGL也是用C语言写成的。那么怎么理解OpenGL的列主序?

先看我自己写的一个测试代码,其中定义了openGL的M3DMatrix44f类型变量。可见,其中被定义的元素(4个字节构成一个元素)分别位于内存的第2、12、13、14处。

似乎符合C++的行主序规则。


再看下从http://download.csdn.net/download/hblhly/7369641下载的math3d.cpp文件,其中定义了一些OpenGL的矩阵操作。

#define A33(row,col)  a[(col*3)+row]
#define B33(row,col)  b[(col*3)+row]
#define P33(row,col)  product[(col*3)+row]

///
// Multiply two 3x3 matricies
void m3dMatrixMultiply33(M3DMatrix33f product, const M3DMatrix33f a, const M3DMatrix33f b )
{
    for (int i = 0; i < 3; i++) {
        float ai0=A33(i,0), ai1=A33(i,1),  ai2=A33(i,2);
        P33(i,0) = ai0 * B33(0,0) + ai1 * B33(1,0) + ai2 * B33(2,0);
        P33(i,1) = ai0 * B33(0,1) + ai1 * B33(1,1) + ai2 * B33(2,1);
        P33(i,2) = ai0 * B33(0,2) + ai1 * B33(1,2) + ai2 * B33(2,2);
    }
}

按照其中的乘法规则,mtx[2]实际上是第2行第0列的元素。所以说,行主序还是列主序,应该从矩阵元素的数学意义来理解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,可以使用列主序消元法(Gaussian elimination with column pivoting)来求解线性方程组。列主序消元法是一种常用的数值方法,用于解决具有大量未知数和方程的线性方程组。 下面是MATLAB中使用列主序消元法求解线性方程组的步骤: 1. 构建增广矩阵:将线性方程组的系数矩阵和常数向量合并成一个增广矩阵。 2. 列主元素选取:选择增广矩阵中当前列的主元素,即绝对值最大的元素所在的行。 3. 主元素交换:将选取的主元素所在行与当前列的第一行进行交换,确保主元素在当前列的第一行。 4. 消元操作:使用当前列的第一行元素将下面的行进行消元,使得当前列下面的元素都变为0。 5. 重复步骤2-4:对于每一列,重复进行主元素选取、主元素交换和消元操作,直到所有列都处理完毕。 6. 回代求解:从最后一行开始,利用已经得到的上三角矩阵,通过回代求解出未知数的值。 下面是一个MATLAB代码示例,演示了如何使用列主序消元法求解线性方程组: ```matlab function x = gaussianElimination(A, b) n = size(A, 1); Ab = [A, b]; % 构建增广矩阵 for k = 1:n-1 [~, pivot] = max(abs(Ab(k:n, k))); % 选取主元素 pivot = pivot + k - 1; Ab([k, pivot], :) = Ab([pivot, k], :); % 主元素交换 for i = k+1:n factor = Ab(i, k) / Ab(k, k); Ab(i, k:n+1) = Ab(i, k:n+1) - factor * Ab(k, k:n+1); % 消元操作 end end x = zeros(n, 1); x(n) = Ab(n, n+1) / Ab(n, n); for i = n-1:-1:1 x(i) = (Ab(i, n+1) - Ab(i, i+1:n) * x(i+1:n)) / Ab(i, i); % 回代求解 end end ``` 使用上述函数,可以通过传入系数矩阵A和常数向量b来求解线性方程组。例如,假设有以下线性方程组: ``` 2x + 3y - z = 7 3x + 2y + 2z = 12 x - y + z = 3 ``` 可以使用以下代码进行求解: ```matlab A = [2, 3, -1; 3, 2, 2; 1, -1, 1]; b = [7; 12; 3]; x = gaussianElimination(A, b); disp(x); ``` 输出结果为: ``` x = 2 1 3 ``` 这样就得到了线性方程组的解x。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值