矩阵中 “行优先“ 和 “列“ 优先

什么是行优先和列优先?

故名思意,当我们表示一个矩阵的时候把行放在前面就是行优先,把列放在前面就是列优先。

比如 一个矩阵[m][n] , 表示为 m行n列矩阵,表示为行优先,当表示为 m 列n行的时候就是表示列优先。

一个三维空间中的向量p分别沿着x方向y方向z方向上分别平移为a,b,c距离,用行优先的平移矩阵表示为

\begin{bmatrix} 1 & 0& 0& 1\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\ a& b& c& 1 \end{bmatrix} ,用一个列优先的平移矩阵表示为\begin{bmatrix} 1 & 0& 0& a\\ 0& 1& 0& b\\ 0& 0& 1& c\\ 0& 0& 0& 1 \end{bmatrix},两个矩阵的关系也不难看出其实是互为转置的。

 

行优先和列优先表示为矩阵和向量相乘的时候是什么样子的呢?

以向量p(a,b,c,1) 平移举例子:

行优先 (x,y,z,0)  *  \begin{bmatrix} 1 & 0& 0& 1\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\ a& b& c& 1 \end{bmatrix} =(x +a, y+b,c+z,0);

列优先表示 \begin{bmatrix} 1 & 0& 0& a\\ 0& 1& 0& b\\ 0& 0& 1& c\\ 0& 0& 0& 1 \end{bmatrix}* \begin{pmatrix}x \\ y \\ z \\0\end{pmatrix}= \begin{pmatrix}x+a \\ y +b\\ z+c \\0\end{pmatrix}

行优先和列优先用c++代码中怎么表示呢?

答案是写法都一样

以上面的矩阵表示的c++代码举例,都可以表示为 float mat[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{a,b,c,1}};行优先表示时候,第 1行为{1,0,0,0} 。从列优先表示第 1列为\begin{pmatrix}1 \\ 0 \\ 0 \\0\end{pmatrix}

 

表示为行优先的时候mat[3]也就是第三行为(a,b,c,1),表示为列优先的时候表示\begin{pmatrix}a \\ b \\ c \\1\end{pmatrix}. 所以 不管行优先还是列优先都不会 影响c++ 代码中的表示。区别只是在于 c++ 代码表示的意义变了。原先的表示的行变成表示的列了。

提到行优先和列优先就不得不说一下dx 与 opengl 区别了,dx 中把矩阵数据提交给gpu,由hlsl 着色器处理,opengl 中把数据提交给gpu由 glsl着色器处理, dx 的c++内存布局处理是按照行优先进行处理的,opengl 的c++布局是按照列优先进行处理的,而hlsl默认内存布局方式也是按照列向量进行处理的,所以会看到 dx把数据传递到gpu端时候会进行转置,而 glsl 中默认内存布局方式 是按照列向量进行处理,传递数据时候不需要进行转置。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值