如何乘以矩阵?

时间:2014-03-01 05:50:06

标签: c++ opengl math

我知道如何乘法矩阵,但我的麻烦是我不知道,是否需要乘以第四行和第四列,或者他们是标准的。我的意思是,我只使用矩阵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]。又发生了什么?

2 个答案:

答案 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]。