墨西哥人文件。传递数据时出错。

2次浏览(过去30天)
阿米特杰哈
阿米特杰哈 2020年4月7日
评论道: 阿米特杰哈2020年5月17日
你好,
我正在与我的第一个墨西哥文件经验斗争。
我写了一个mex函数如下。
文件名为hello_world.c
包括< math.h >
包括< matrix.h >
包括< mex.h >
无效mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
* C* Node_val;
intl1,l2, v1, v2, k, n, k, ip,jp,j,i1,i2;
Cijk
* CE*散列;
//获取RHS用于作为输入的标量的指针
l1 = mxGetScalar(prhs[0]);
l2 = mxGetScalar(prhs[1]);
v1 = mxGetScalar(prhs[2]);
k = mxGetScalar(prhs[3]);
K = mxGetScalar(prhs[4]);
n = mxGetScalar(prhs[5]);
散列= mxGetPr (prhs [6]);
C = mxGetPr (prhs [7]);
Node_val = mxGetPr (prhs [8]);
/ / printf (“H: % f”、散列);
//创建一个输出指针
plhs[0] = mxCreateDoubleMatrix(n, k, mxREAL);
CE = mxGetPr(plhs[0]);
(v2 = l1-1;v2< = l2-1;v2 = v2 + 1)
j =散列(v2);
如果(j <=2 || j >= K-1)
{i1 =哈希[v2+n];
i2 =哈希[v2+2*n];
IP = 1/2*(j-i1);
Jp = 1/2*(j+i1);
Cijk = C[ip+(jp)*(K/2+1)];
IP = 1/2*(j-i2);
Jp = 1/2*(j+i2);
CE[v2] = Cijk+C[ip+(jp)*(K/2+1)]+Node_val[v1-1];
printf (“CE: % f”、CE);
这个Matlab代码,我从下面调用这个mexfunction。我得到错误的输出CE[1:3]=[0,8.0362, 8.036, 8.036,........0,0]。我明白哈希[v2]没有将整数传递给j,因为j是int,哈希是一个双指针。
散列=兰德(14日3);
n = 14;
K = 4;
k = 1;
l1 = 2;
l2 = 4;
v1 = 1;
C = (4.01808033751942, 1.23318934835166, 4.17267069084370, 0.759666916908419, 1.83907788282417, 0.496544303257421, 2.39916153553658, 2.39952525664903, 9.02716109915281);
Node_val = 1 (n, 3);
Node_val(1,:)=[0 0 0];
% CE = 1 (n, 1);
墨西哥人hello_world.c
CE = hello_world (l1, l2, v1, k, k, n,散列,C, Node_val);
1评论
阿米特杰哈
阿米特杰哈 2020年5月17日
谢谢 Guillaume .问题已按你的建议解决了。使用1将变量哈希和浮点数转换为整数的数据类型声明错误。/2而不是1/2。这些是除其他一些索引错误外的基本错误。非常感谢。

登录评论。

接受的答案

Guillaume
Guillaume 2020年4月7日
编辑:Guillaume 2020年4月7日
您的代码的行为完全符合我的期望:填充元素 l1 l2 CE 第一个元素的两倍 C .我建议你找一本关于C语言的参考书,查一下双精度到整数的转换和混合双精度/整数算术。
你的 哈希 double类型的数组,值在0到1之间。你有 j 定义为整数,do:
j =散列(v2);
这是一个双精度到整数的隐式转换。double的小数部分被截断。 j 的积分部分总是0 哈希 总是0。
你还有:
IP = 1/2*(j-i1);
这里有三个问题:
  • 1/2是0。你有两个整数字面量,所以你在执行C整数除法。如果你想要双倍的0.5,你需要写1. / 2(点critical声明浮点字面值),或者直接写入0.5
  • 因为右边所有的操作数都是整数,所以所有的数学都是整数数学。
  • 知识产权无论如何都是整数,所以即使右边产生了一个双值,它也会被截断为它的整部分
到处都一样。最终的结果是两者都有 Cijk 而且 C [ip + (jp) * (K / 2 + 1) 总是 C [0] 因为 i1 i2 ,等总是0。
= = = =
此外,您不需要对输入执行任何验证。期望你的代码分段错误(并杀死matlab),直到你这样做。你从来没有检查过 nrhs 9是快乐的解指吗 prhs .你从来没有检查过 l1 而且 l2 正整数是否小于其中的元素数 哈希 .你从不检查你生成的索引 哈希 的有效索引 C ,或者 v1 是有效的 Node_val

更多答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!