永发信息网

怎么写关于矩阵的程序

答案:1  悬赏:60  手机版
解决时间 2021-07-25 00:11
随便举个关于求矩阵伴随阵
最佳答案
算法介绍
矩阵求逆在3D程序中很常见,主要应用于求Billboard矩阵。按照定义的计算方法乘法运算,严重影响了性能。在需要大量Billboard矩阵运算时,矩阵求逆的优化能极大提高性能。这里要介绍的矩阵求逆算法称为全选主元高斯-约旦法。

高斯-约旦法(全选主元)求逆的步骤如下:

首先,对于 k 从 0 到 n - 1 作如下几步:

从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。
m(k, k) = 1 / m(k, k)
m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k
m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k
m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。

实现(4阶矩阵)
float Inverse(CLAYMATRIX& mOut, const CLAYMATRIX& rhs)
{
CLAYMATRIX m(rhs);
DWORD is[4];
DWORD js[4];
float fDet = 1.0f;
int f = 1;

for (int k = 0; k < 4; k ++)
{
// 第一步,全选主元
float fMax = 0.0f;
for (DWORD i = k; i < 4; i ++)
{
for (DWORD j = k; j < 4; j ++)
{
const float f = Abs(m(i, j));
if (f > fMax)
{
fMax = f;
is[k] = i;
js[k] = j;
}
}
}
if (Abs(fMax) < 0.0001f)
return 0;

if (is[k] != k)
{
f = -f;
swap(m(k, 0), m(is[k], 0));
swap(m(k, 1), m(is[k], 1));
swap(m(k, 2), m(is[k], 2));
swap(m(k, 3), m(is[k], 3));
}
if (js[k] != k)
{
f = -f;
swap(m(0, k), m(0, js[k]));
swap(m(1, k), m(1, js[k]));
swap(m(2, k), m(2, js[k]));
swap(m(3, k), m(3, js[k]));
}

// 计算行列值
fDet *= m(k, k);

// 计算逆矩阵

// 第二步
m(k, k) = 1.0f / m(k, k);
// 第三步
for (DWORD j = 0; j < 4; j ++)
{
if (j != k)
m(k, j) *= m(k, k);
}
// 第四步
for (DWORD i = 0; i < 4; i ++)
{
if (i != k)
{
for (j = 0; j < 4; j ++)
{
if (j != k)
m(i, j) = m(i, j) - m(i, k) * m(k, j);
}
}
}
// 第五步
for (i = 0; i < 4; i ++)
{
if (i != k)
m(i, k) *= -m(k, k);
}
}

for (k = 3; k >= 0; k --)
{
if (js[k] != k)
{
swap(m(k, 0), m(js[k], 0));
swap(m(k, 1), m(js[k], 1));
swap(m(k, 2), m(js[k], 2));
swap(m(k, 3), m(js[k], 3));
}
if (is[k] != k)
{
swap(m(0, k), m(0, is[k]));
swap(m(1, k), m(1, is[k]));
swap(m(2, k), m(2, is[k]));
swap(m(3, k), m(3, is[k]));
}
}

mOut = m;
return fDet * f;
}


比较
原算法 原算法(经过高度优化) 新算法
加法次数 103 61 39
乘法次数 170 116 69
需要额外空间 16 * sizeof(float) 34 * sizeof(float) 25 * sizeof(float)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
田地如何利用
点解结佐婚就一定要上床呢?
我的电脑还能用?
跪求一首英文歌曲,旋律有点快?
英语翻译明:古文从日.云古文作明.则朙非古文
我用EMS送个东西未妥投好几次
什么是时差症
诺基亚N82怎么不要待机模式竖栏下面几个东西
蜗居好看还是奋斗好看?那个更现实一点?
请各位说下怎么减掉脸上的肉或者取掉水肿的个
但你无法抉择的时候.该怎么半?
为什么大家不愿接受亨利他们两只呢。。
阴虱病搽好百夫康药膏就可以吗
蚂蚁和大象摔跤哪个会赢
什么办法入睡最快?
推荐资讯
法师穿幽怨与魔能
为什么老是感觉很难和父母沟通
MP5哪款比较好点,有亲身经历的介绍下
英语电影名句经典语录,求经典英文电影名句
如图,三角形ABC中,角B=角BAC,角BAC的外角平分
梦到洗衣机是什么意思,全自动洗衣机的电动机
need a deep breath
青岛的小倩倩馄饨好吃吗?
11月21.22号桂林银杏林的叶子掉了么?
求一张普陀区的初二语文、数学、外语、物理的
在我q空间的最近访客中,出现了匿名的人,但
上海新娘帮摄影工作室在哪啊?具体的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?