找回密码
 注册
Simdroid-非首页
查看: 208|回复: 6

[已解决]c++调用matlab2009b生成的dll时,如何传递稀疏矩阵(NewSparse/mwArray)

[复制链接]
发表于 2009-11-17 20:23:44 | 显示全部楼层 |阅读模式 来自 浙江杭州
本帖最后由 messenger 于 2010-1-5 22:12 编辑

最近使用c++(vs2008)与matlab2009b采用dll形式进行混编。
c++调用matlab生成的dll。
怎么也找不到c++与matlab dll的稀疏矩阵的接口 。目前,我只能用mwarray传一个实矩阵给matlab 的dll,然后在dll里面通过sparse()生成稀疏矩阵。
以前用matlab6.5 的c++库时,直接就可以通过三元组生成稀疏矩阵,
怎么matlab2009里面没有了吗?


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
已经解决了,就是用 NewSparse(mwSize data_size, const mwIndex* rowindex,                         const mwIndex* colindex, mxDouble* rData,  mxDouble *iData, mwSize num_rows, mwSize num_cols,  mwIndex nzmax, mxClassID id, mxComplexity cplx) ;

matlab里面的稀疏矩阵是采用三元组来表示的,就是说表示一个稀疏矩阵需要三个向量。
分别是所在行数、列数、值。
比如表示稀疏矩阵[ 1 0 1;0 1 0;1 0  0]
就得用三个向量 [1 1 2 3] ,[1 3 2 1] and [1 1 1 1]
在c++里,这三个向量都可以用数组表示。
下面说一下NewSparse 函数各个参数的意义
第一个参数:int 型,数据的个数,就是索引数组的大小
第二个参数:用int*即int型数组强制转换成(mwIndex *),表示行索引
第三个参数:类型同上,表示列索
第四个参数:double *型,表示数据的实部
第五个参数:double*型,表示数据的虚部,不是复数的话,此项填NULL
第六个参数:int型,表示总的行数,也就是行索引数组里的最大值
第七个参数:  int 型,表示总的列数,也就是列索引最大值
第八个参数:int型,表示稀疏矩阵非零元的个数,可能比第一个参数小,因为索引可能会重复,matlab对重复索引是把值相加。
第九个参数:数据类型,一般是double型就填mxDOUBLE_CLASS
第十个参数:实数或复数的标识,如果实数,填 mxREAL

下面再贴一下我使用稀疏矩阵的例子
    int nSize=this->Size();
    int * pRowIndex=new int[nSize];
    int * pColumnIndex=new int[nSize];
    double * pData=new double[nSize];
    ... ....  ...数组赋值省略
    mwArray spMatrix=mwArray::NewSparse(nSize,(mwIndex *)pRowIndex,(mwIndex *)pColumnIndex,pData,NULL,Cal_nColumns(),Cal_nColumns(),nSize,mxDOUBLE_CLASS,mxREAL);

评分

2

查看全部评分

发表于 2009-11-18 19:44:53 | 显示全部楼层 来自 浙江杭州
Simdroid开发平台
c++中的设置不对吧

话说你原来是怎么调用的呀?专家、牛人什么的都不在,你说的详细点,让我们这些水平有限的也试着出出主意
回复 不支持

使用道具 举报

发表于 2009-11-18 20:55:00 | 显示全部楼层 来自 新加坡
应该可以用NewSparse成员函数,这个在文档中没有提到,不知道为什么。我没有试过,不保证可用。

函数申明如下。

  1. class mwArray
  2. {
  3. public:
  4.     ...
  5.     static mwArray NewSparse(mwSize data_size, const mwIndex* rowindex,
  6.                              const mwIndex* colindex, mxDouble* rData,
  7.                              mxDouble *iData, mwSize num_rows, mwSize num_cols,
  8.                              mwIndex nzmax, mxClassID id, mxComplexity cplx) ;
  9.    ...
  10. };
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-19 15:23:01 | 显示全部楼层 来自 浙江杭州
3# messenger

话说你原来是怎么调用的呀?专家、牛人什么的都不在,你说的详细点,让我们这些水平有限的也试着出出主意
messenger 发表于 2009-11-18 19:44


c++调用matlab dll 比较方便,很详细请看 taohe大侠的贴子:http://forum.simwe.com/thread-801187-1-1.html
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-19 17:04:04 | 显示全部楼层 来自 浙江杭州
这个成员函数我也试过,可惜没有成功,主要是对matlab 的数据结构不熟,这个函数的参数列表都搞不太清,还请toahe大侠再指点一下,介绍下这个函数的参数!期待!



应该可以用NewSparse成员函数,这个在文档中没有提到,不知道为什么。我没有试过,不保证可用。

函数申明如下。
class mwArray
{
public:
    ...
    static mwArray NewSparse(mwSize data_size, const mw ...
taohe 发表于 2009-11-18 20:55
回复 不支持

使用道具 举报

 楼主| 发表于 2010-1-4 20:14:34 | 显示全部楼层 来自 浙江杭州
希望牛人有更好办法!
回复 不支持

使用道具 举报

发表于 2010-1-4 21:07:06 | 显示全部楼层 来自 广西贵港
运用mwArray,这应该是“唯一”的简洁办法
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 15:44 , Processed in 0.039339 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表