我知道如何乘法矩阵,但我的麻烦是我不知道,是否需要乘以第四行和第四列,或者他们是标准的。我的意思是,我只使用矩阵3x3,然后我添加第4行和第4列,因为它将成为矩阵4x4。
如果我有一个矩阵:
float *mat = new float[16];
/*
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
*/
//standart
mat[12] = mat[13] = mat[14] = mat[3] = mat[7] = mat[11] = 0.0f;
mat[15] = 1.0f;
但是有旋转,缩放和平移的矩阵。它是如何工作的?拜托,有人可以解释一下吗?同样,我们有一个正交或透视矩阵(投影矩阵)。 总
我们有一个观点,例如p[x,y,z]
。又发生了什么?
答案 0 :(得分:2)
暂时让我们从乘法矩阵中退一步,看看我们如何将向量相互叠加。有两种普遍适用的矢量产品:内部产品(也称为标量产品)和外部产品。 (然后是交叉产品,它只适用于某些类型的矢量)。
目前我们只看一下内部产品。如果第一个操作数是行向量,则将内积定义为第i列(_
)与第i行(^
)之和的总和
<a,b> = ∑ a_i b^i
或第i列的第i行,如果第一个操作数是列向量,则通过翻转它们的顺序
<a,b> = ∑ b_i a^i
对于实数,顺序的相反可能看起来是任意的,但是如果你看一下非交换组中的元素向量(而矩阵就是那个)。
当然这需要让一个向量具有与另一个向量具有行一样多的列。所以我们假设我们有两个行向量 a 和 b
a = (a1, a2, …, an)
b = (b1, b2, …, bn)
显然,我们无法在内部产品中繁殖。但是让我们转换其中一个,制作一个有效的列T(b)= b_。
<a,b_> = a1 b1 + a2 b2 + … + an bn
到目前为止一切顺利。
现在让我们看一下矩阵乘法。如果查看矩阵,可以将其视为一列行向量
(11, 12, …, 1n)
(21, 22, …, 2n)
(…1, …2, …, …n)
(m1, m2, …, mn)
但这只是行向量的列向量!
/ (11, 12, …, 1n) \
| (21, 22, …, 2n) |
| (…1, …2, …, …n) |
\ (m1, m2, …, mn) /
或者您可以将其视为一列列向量
/11\ /12\ /1…\ /1n\
|21| |22| |2…| |2n|
|…1| |…2| |……| |…n|
\m1/ \m2/ \m…/ \mn/
当然这只是列向量的行向量
/ /11\ /12\ /1…\ /1n\ \
| |21| |22| |2…| |2n| |
| |…1| |…2| |……| |…n| |
\ \m1/ \m2/ \m…/ \mn/ /
那么你试图通过内部产品放两个问题会发生什么? <A,B> = ?
。事实证明,如果A的行数与B一样多,而B的行数与A的数量相同,那么如果将A视为行向量列而B视为一列列向量,则这两列可以聚在一起。那么你接下来是第i行的A并将其内积与B的每个第(j)列一起,将结果写在结果矩阵的ij位置。
<A,B>_ij = <A^i,B_j>
答案 1 :(得分:0)
将4x4矩阵乘以它们是矩阵。第四行和列允许齐次坐标([x,y,z,w]对应于[x / w,y / w,z / w]),这允许平移被表示为线性变换。要将此变换应用于点(x,y,z),请将该矩阵乘以列向量[x,y,z,1]。