通过墨西哥人发送大型稀疏矩阵C: matlab崩溃

6视图(30天)
我写了一个墨西哥人的代码发送一个标量从matlab代码和一个矩阵c代码。它将正常工作与较小的矩阵。然而,当我试图通过大型稀疏矩阵(~ 8448 x 3264)大小,matlab崩溃与以下错误:
我得到以下错误: Matlab遇到了一个内部问题,需要关闭。
*详细的错误报告*
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分割发现违反我的2月9 13:21:48 2015
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
配置:
崩溃解码:禁用
当前的视觉:没有
默认的编码:utf - 8
GNUC库:2.19稳定
MATLAB架构:glnxa64
MATLAB:/usr/local/MATLAB/R2014b
MATLAB版本:8.4.0.150421 (R2014b)
操作系统:ubuntu Linux 3.13.0-37-generic # 64 - SMP Mon 2014年9月22日21:28:38 UTC x86_64
处理器ID44步进2:x86家族6模型,GenuineIntel
软件OpenGL:1
虚拟:Java 1.7.0_11-b21与甲骨文公司Java HotSpot VM (TM) 64位服务器混合模式
窗口系统:不活跃的显示
的错数:1
不正常的终止:
分割违反
注册从故障状态():
递交= 00007 f011f000000 RBX = 0000000000000001
RCX = 0000000000260 fe0 RDX = 0000000000260 f0162197000
负责= 00007 f024fffb4f0 RBP = 00007 f024fffb4f0
肢体重复性劳损症= 00007 f011ed9f020 RDI = 00007 f0161f36020
R8 = 00007 f011ed9f010 R9机型= 0000000000000000
R10 R11 = = 0000000000000022 0000000048000001
R12 = 00007 f024fffbaf0 R13 = 00007 f01c63b57f0
R14 = 00007 f024fffbb00 R15 = 00007 f024fffbb00
RIP = 00007 f01618d491e英语= 0000000000010206
c = 0033 FS = 0000 g = 0000
堆栈从断层Trace ():
[0]0 x00007f01618d491e /home/dkumar/Mex_Codes_DKU / Matlab_Calling_C / Test_2 / mexcallingmatlab.mexa64 + 00002334
[1]0 x00007f01618d4a8e /home/dkumar/Mex_Codes_DKU / Matlab_Calling_C Test_2 / mexcallingmatlab。mexa64 + 00002702 mexFunction + 00000325
....
更新:由于Tursa先生,我可以解决我的问题。我只是更新本节通过后面的工作代码
这是我的matlab代码:
%建立系统矩阵大小(8448 x 3264) smA_System = ConstructSystemMatrix ();
抽搐
x = 9;
y = 1 (3);
%,这就做得够好了
z = mexcallingmatlab (x, y);
%这给错误
z = mexcallingmatlab (x, smA_System);
toc
更新部分:
这是我的墨西哥人工作的代码
#包括“mex.h”
#包括“matrix.h”/ /定义Matlab稀疏矩阵
#包括< stdio . h >
#包括“/ home / dkumar / libtsnnls-2.3.3 / tsnnls taucs_basic / taucs.h”
无效mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
{
双* y, * z、x;
/ * * /声明变量
mwSize mrows ncols;
int状态;
mwSize nzmax;
mwIndex *国税局,* jcs j k;
如果(nrhs ! = 2)
mexErrMsgTxt (“两个输入必需的。”);
如果(nlhs ! = 1)
mexErrMsgTxt (“一个输出所需。”);
/ *检查确保第一个输入参数是一个标量。* /
如果(! mxIsDouble (prhs [0]) | | mxIsComplex (prhs [0]) | | mxGetN (prhs [0]) * mxGetM (prhs [0]) ! = 1) {
mexErrMsgTxt (“输入x必须是一个标量。”);
}
/ *得到标量输入x。* /
x = mxGetScalar (prhs [0]);
/ *创建一个指针指向输入矩阵y。* /
y = mxGetPr (prhs [1]);
/ *检查数据类型维度的矩阵输入y。* /
如果(! (mxIsDouble (prhs [1]))) {
mexErrMsgIdAndTxt (“MATLAB: DKU”,“double类型的输入参数必须。”);
}
如果(mxGetNumberOfDimensions (prhs [1]) ! = 2) {
mexErrMsgIdAndTxt (“MATLAB: DKU”,“输入参数必须是二维\ n”);
}
/ *得到大小和输入数据的指针* /
mrows = mxGetM (prhs [1]);
ncols = mxGetN (prhs [1]);
/ /验证事实上稀疏矩阵y
如果(! (mxIsSparse (prhs [1]))) {
mexErrMsgIdAndTxt (“MATLAB: DKU”,“输入矩阵不是稀疏\ n”);
}其他的{
sr = mxGetPr (prhs [1]);
jcs = mxGetJc (prhs [1]);
国税局= mxGetIr (prhs [1]);
}
/ /现在转换稀疏矩阵TAUCS格式
taucs_ccs_matrix*一个;
= (taucs_ccs_matrix *) malloc (sizeof (taucs_ccs_matrix));
- > n = ncols;
- > m = mrows;
- >旗= TAUCS_DOUBLE;
/ /分配空间
intnnz = jcs [ncols];
- > colptr = (int *) mxMalloc (sizeof (int) * (- > n + 1));
- > rowind = (int *) mxMalloc (sizeof (int) * nnz);
- >值。d =(双*)mxMalloc (sizeof (taucs_double) * nnz);
inticolOffset = 0;/ / Matlab“稀疏”指数从0比0的C
- > colptr = jcs-icolOffset;
- > rowind = irs-icolOffset;
- >值。d =老;
/ *创建一个C指针的一个副本输出矩阵。* /
memcpy (mxGetPr (plhs[0]),和,sizeof (A));
/ /释放空间
mxFree (A - > colptr);
mxFree (A - > rowind);
mxFree (A - > values.d);
}

接受的答案

詹姆斯Tursa
詹姆斯Tursa 2015年2月9日
编辑:詹姆斯Tursa 2015年2月9日
稀疏矩阵不存储在内存中以同样的方式,完整的矩阵。特别是,0的物理存储。举例来说,在100 x 100全矩阵有10000物理双值存储在内存中。但在100 x 100稀疏矩阵只能有一小部分这些值存储在内存中。如果你传递一个稀疏矩阵为墨西哥人常规循环遍历所有的值,然后尝试,好像他们都在内存中,您可能会运行结束的有效记忆和得到一个报错(当你发现)。
解决办法:你需要有单独的代码来处理特殊的稀疏矩阵内部格式(看一些例子在doc)…你不能用你的双圈所示代码。如果你想要一个稀疏矩阵输出您需要创建它mxCreateSparse函数(而不是mxCreateDoubleMatrix)。例如,下面是代码,会告诉你有多少稀疏矩阵的元素在内存中物理存储:
mwIndex元素个数;
mwIndex* Jc;
size_tN;
N = mxGetN (prhs [1]);%的列数
Jc = nxGetJc (prhs [1]);%物理存储的元素数量在每一列(指针)
元素个数= Jc [N];/ /数量元素的物理存储在内存中(Jc数组中的最后一个值)
元素个数的值可以是任何数量从0到mxGetM (prhs [1]) * mxGetN (prhs [1])。
底线是你需要要么不允许稀疏矩阵作为输入你的墨西哥人常规(检查他们mxIsSparse函数),或者提供全新的代码来处理它们(例如审查的墨西哥人稀疏的代码示例文档)。
3评论
Dushyant
Dushyant 2015年2月10日
编辑:Dushyant 2015年2月10日
谢谢,Tursa先生。
我用Matlab R2014b 64位。
甚至缺乏适当的文档TAUCS是我制作的难度。总之,广泛的在线搜索之后,我发现了一个c++代码行c++转换格式列主要TAUCS格式:
请看代码段开始后发表评论
/ / 2 b)转换SparseMatrix TAUCS CCS
另外,我修改mex-code指示。
因为我不是好的在C语言中,我将不胜感激如果你可以再看一次我的墨西哥人代码和比较它与其它c++代码。
去年我的部分代码: 我需要将内存分配给plhs[0]在应对TAUCS矩阵之前吗?

登录置评。

更多的答案(0)

类别

找到更多的在性能和内存帮助中心文件交换

标签

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!