Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将矩阵相乘?_C++_Opengl_Math - Fatal编程技术网

C++ 如何将矩阵相乘?

C++ 如何将矩阵相乘?,c++,opengl,math,C++,Opengl,Math,我知道如何对矩阵进行乘法,但我的问题是,我不知道是否需要对第四行和第四列进行乘法,或者它们是标准的。我的意思是,我只乘以一个矩阵3x3,然后我加上一个第四行和第四列,这样它就会变成一个矩阵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

我知道如何对矩阵进行乘法,但我的问题是,我不知道是否需要对第四行和第四列进行乘法,或者它们是标准的。我的意思是,我只乘以一个矩阵3x3,然后我加上一个第四行和第四列,这样它就会变成一个矩阵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]
。接下来会发生什么?

将4x4矩阵相乘,就好像它们是矩阵一样。第四行和第四列允许齐次坐标(其中[x,y,z,w]对应于[x/w,y/w,z/w]),允许将平移表示为线性变换。要将此变换应用于点(x,y,z),请将该矩阵与列向量[x,y,z,1]相乘。

让我们先从矩阵相乘中退一步,看看如何将向量相乘。有两种普遍适用的向量积:内积(也称为标量积)和外积。(还有只对某些向量有效的叉积)

现在让我们只看一下内部产品。如果第一个操作数是行向量,则将内积定义为每个向量的第i列(
^
)与第i行(
^
)之和

<a,b> = ∑ a_i b^i
显然,我们不能在内积中乘以这些。但是让我们转置其中一个,来生成一列,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\ /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/ /
当然,这只是一个列向量的行向量

/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的列数一样多,B的行数和A的列数一样多,那么如果你将A视为行向量的列,将B视为列向量的行,那么这两者可以结合在一起。然后,取A的第i行,取其与B的每一列(第j列)的内积,将结果写在结果矩阵的ij位置

<A,B>_ij = <A^i,B_j>
\u ij=

如果需要为opengl处理矩阵,为什么不直接使用?是的,将第四行和第四列相乘,求和,总数将成为相应的占位符。我不确定我是否理解其余部分。我使用了“本征”,glm,但我想自己学习并做这件事。如果我们将矩阵4x4(例如,单位矩阵)乘以旋转矩阵(4x4),那么我们在3,7,11个元素中得到的结果是否无效?@Nawy如果旋转矩阵的列数与原始行数一样多,您将不会收到问题。在这种情况下,4x4旋转仍然是4x4,因此您将很好。
<A,B>_ij = <A^i,B_j>