Excel函数使用——求逆矩阵和矩阵的值(Minverse和MDeterm)

本文介绍了一种使用SAFEARRAY进行逆矩阵计算的方法,并详细展示了如何将SAFEARRAY转换为普通数组的过程。通过具体示例代码,实现了逆矩阵的计算与提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

帮网友解决求逆矩阵的问题。本文的重点是动态数组的使用和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.250.25-0.75

000.5

0.75-0.25-0.25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值