Excel函数使用——求逆矩阵和矩阵的值(Minverse和MDeterm)
来源:互联网 发布:手机淘宝怎么注册不上 编辑:程序博客网 时间:2024/06/06 03:23
帮网友解决求逆矩阵的问题。本文的重点是动态数组的使用和SAFEARRAY转换成普通数组的方法(也就是SafeArrayGetElement函数的使用)。
// 定义测试数组
int arg2[3][3] = {1, 2, 1,
3, 4, -1,
0, 2, 0};
// 计算(这个方法没变)
VARIANT varArg1;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0; // 该维的下界
rgsabound[0].cElements = 3; // 该维的元素个数
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 3;
long lIndex[2];
psa = SafeArrayCreate(VT_I4, 2, rgsabound); // 二维
for (long k = 0; k < (long)3; k++)
{
lIndex[0] = k;
for ( long num = 0; num < (long)3; num++ )
{
lIndex[1] = num;
SafeArrayPutElement (psa, lIndex, &arg2[k][num]); //
}
}
varArg1.vt = VT_ARRAY | VT_I4; // 整型数组
varArg1.parray = psa; // 存储数据
VARIANT varRet = oFun.MInverse( varArg1 );
// 其实结果是正确的,只是开始没有找到提取逆矩阵的方法
// 我通过计算矩阵值的函数来计算逆矩阵,结果与Excel中的吻合
double varVal = oFun.MDeterm( varRet ); // 0.125,正确
// 于是寻找提取逆矩阵的方法
// 定义一个动态的二维数组
VARIANT** arg3; // 此处必须用VARIANT类型
// 根据逆矩阵的维数和大小分配空间
// 先获取逆矩阵的信息
UINT uDim = SafeArrayGetDim( varRet.parray );
UINT uEleSize = SafeArrayGetElemsize( varRet.parray );
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( varRet.parray, 1, &nDim1UBound );
SafeArrayGetLBound( varRet.parray, 1, &nDim1LBound );
long nDim2UBound;
long nDim2LBound;
SafeArrayGetUBound( varRet.parray, 2, &nDim2UBound );
SafeArrayGetLBound( varRet.parray, 2, &nDim2LBound );
long nDim1Count = nDim1UBound - nDim1LBound + 1;
long nDim2Count = nDim2UBound - nDim2LBound + 1;
// 分配空间
arg3 = new VARIANT *[nDim1UBound];
for ( int nn = 0; nn < nDim1UBound; nn++ )
{
arg3[nn] = new VARIANT[nDim2UBound];
}
// 提取逆矩阵
int x = 0;
int y = 0;
for ( long nDim1 = nDim1LBound; nDim1 <= nDim1UBound; nDim1++ )
{
lIndex[0] = nDim1;
y = 0;
for ( long nDim2 = nDim2LBound; nDim2 <= nDim2UBound; nDim2++ )
{
lIndex[1] = nDim2;
SafeArrayGetElement (varRet.parray, lIndex, &arg3[x][y]); //
y++;
}
x++;
}
// 输出测试结果
for ( i = 0; i < nDim1UBound; i++ )
{
for ( int j = 0; j < nDim2UBound; j++ )
{
CString strMsg;
strMsg.Format( _T( "%f" ), arg3[i][j].dblVal );
AfxMessageBox( strMsg );
}
}
// 释放内存
SafeArrayDestroyData( psa );
for ( nn = 0; nn < nDim1UBound; nn++ )
{
delete[] arg3[nn];
}
delete arg3;
// 逆矩阵
0.25 0.25 -0.75
0 0 0.5
0.75 -0.25 -0.25
- Excel函数使用——求逆矩阵和矩阵的值(Minverse和MDeterm)
- Excel函数使用——求逆矩阵和矩阵的值(Minverse和MDeterm)
- gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)
- 求矩阵的转置矩阵和两个矩阵相乘
- 矩阵的乘法和求逆(C语言实现)
- Java实现的矩阵类及矩阵的转置,加减乘和矩阵求逆
- 用excel求逆矩阵
- 用excel求逆矩阵
- opencv 求矩阵的特征向量矩阵和特征值
- opencv 求矩阵的特征向量矩阵和特征值
- 求矩阵中元素和最大的二维子矩阵
- 求矩阵中2×2子矩阵和的最大值
- 【动态规划】求二维矩阵的最大和子矩阵
- poj 1050 求矩阵最大的子矩阵和 DP
- tf.matrix_diag和tf.matrix_inverse的用法(tensorflow如何生成对角矩阵和求逆矩阵)
- 如何在VC++中调用matlab的求行列式和逆矩阵函数
- 如何在VC++中调用matlab的求行列式和逆矩阵函数
- 求二维数组最大子数组和(或矩阵的最大子矩阵和)
- Java开发面试题
- VC操作Excel——打印预览
- linux常用测试命令
- ubuntu 系统清理常用命令
- Excel编程——自动换行
- Excel函数使用——求逆矩阵和矩阵的值(Minverse和MDeterm)
- linux yum命令详解
- Excel函数使用——求方差(Var或VarP)
- Excel函数使用——求方差(Var或VarP)
- 软件测试用例设计方法
- PostgreSQL工具pg_ctl实现代码
- 1、VS2003 无法启动调试。没有正确安装调试器!
- Excel编程——获得Excel中的函数
- 关于HTML数据在线编辑