- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我尝试使用结构变量编写 mexfunctions。我观看了教程,但由于变量值的传递方式而感到困惑。以下示例 (mexfunction_using_ex_wrong.m & mexfunction_using_ex_wrong.cpp
) 演示了如何在 mexfunction 中获取从 matlab 传递的变量。然而,在这种情况下,结果是:
address i_c1=2067094464 i_c2=2067094464
i_c1=10 i_c2=10
address i_c1=1327990656 i_c2=2067100736
i_c1=2 i_c2=20
address i_c1=2067101056 i_c2=2067063424
i_c1=3 i_c2=30
可以看出,结构体变量的 c1 和 c2 数组的第一个元素意外地相同。
但是,在另一个示例(mexfunction_using_ex_ Correct.m & mexfunction_using_ex_ Correct.cpp
)中,结构体变量的数组 1 (b1) 和数组 2(b2) 的元素与我预期的不相关。结果是:
address i_b1=1978456576 i_b2=1326968576
i_b1=1 i_b2=10
address i_b1=1978456584 i_b2=1326968584
i_b1=2 i_b2=20
address i_b1=1978456592 i_b2=1326968592
i_b1=3 i_b2=30
但是,在编程中使用第一个示例更为常见。那么有人可以解释为什么在第一个示例中 i_c1 和 i_c2 的地址是相同的吗?
以下代码是mexfunction_using_ex_wrong.m
clc
clear all
close all
mex mexfunction_using_ex_c_wrong.cpp;
a.b(1).c1=double(1);
a.b(2).c1=double(2);
a.b(3).c1=double(3);
a.b(1).c2=double(1);
a.b(2).c2=double(2);
a.b(3).c2=double(3);
mexfunction_using_ex_c_wrong(a);
以下代码是mexfunction_using_ex_c_wrong.cpp
#include "mex.h"
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
int i, j, k;
double *i_c1;
double *i_c2;
// for struct variables(pointers) inside fcwcontext
mxArray *mx_b, *mx_c1, *mx_c2;
mx_b=mxGetField(prhs[0], 0, "b");
for(i = 0;i < 3;i=i+1)
{
mx_c1=mxGetField(mx_b, i, "c1");
mx_c2=mxGetField(mx_b, i, "c2");
i_c1=mxGetPr(mx_c1);
i_c2=mxGetPr(mx_c2);
*i_c2=(*i_c2)*10;
printf("address i_c1=%d i_c2=%d\n", i_c1, i_c2);
printf(" i_c1=%g i_c2=%g\n", *i_c1, *i_c2);
}
}
以下代码是mexfunction_using_ex_c_ Correct.m
clc
clear all
close all
mex mexfunction_using_ex_correct.cpp;
a.b1(1)=double(1);
a.b1(2)=double(2);
a.b1(3)=double(3);
a.b2(1)=double(1);
a.b2(2)=double(2);
a.b2(3)=double(3);
mexfunction_using_ex_correct(a);
以下代码是mexfunction_using_ex_c_ Correct.cpp
#include "mex.h"
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
int i, j, k;
double *i_b1;
double *i_b2;
mxArray *mx_b1, *mx_b2;
mx_b1=mxGetField(prhs[0], 0, "b1");
mx_b2=mxGetField(prhs[0], 0, "b2");
for(i = 0;i < 3;i=i+1)
{
i_b1=mxGetPr(mx_b1);
i_b2=mxGetPr(mx_b2);
i_b2[i]=i_b2[i]*10;
printf("address i_b1=%d i_b2=%d\n", &i_b1[i], &i_b2[i]);
printf(" i_b1=%g i_b2=%g\n", i_b1[i], i_b2[i]);
}
}
最佳答案
这些地址并非“意外地相同”,而是有意相同,这是由于 MATLAB 内部的写时复制优化所致。如果您查看 MEX 文档,您会看到警告分散在各处...
...各种形式...
...试图非常清楚地表明您绝对不应该修改收到的任何输入内容。通过调用mxGetPr()
输入数据并写回该指针,就像使用 i_b2
一样和i_c2
,如果您查看a.b(1).c1
,您就进入了“不可预测的结果”领域。在调用后的 MATLAB 工作区中,它实际上是 10,即使您“仅”更改了 c2
.
从 MEX 中,您查看原始数据存储,而无需了解或访问 MATLAB 的内部管理,因此修改任何内容的唯一安全方法是使用 mxCreate*
或mxDuplicate*
函数来获取您自己的安全数组,然后您可以执行任何您想要的操作,并通过 plhs
传回 MATLAB .
也就是说,我承认我滥用了 in-place modification在一种情况下,我可以保证我的数据是唯一的且不共享的,但它充其量不受支持,最坏的情况是完全危险的,从而获得显着的性能提升。
关于c - 结构变量数组中的 mexfunction 变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27560226/
我正在读取一个二进制数据文件,该文件是通过调用 Matlab m 文件中的以下行编写的: disp(sprintf('template = %d', fwrite(fid, template_1d,
我正在尝试使用 mex(MacOSX Lion 上的 MATLAB 2012b)编译 C 文件。我的项目包含三个文件: 定义主要功能的头文件,smdvquad.h smdvquad.h 的 C 实现,
我是 mex 类型编程的新手,基本上我正在编写我的第一个 mexfunction,但我遇到了一个愚蠢的问题。我附上我的部分代码: void mexFunction(int nlhs, mxArray
最近,我尝试使用结构变量编写 mexfunctions。我观看了教程,但由于变量值的传递方式而感到困惑。以下示例 (mexfunction_using_ex_wrong.m & mexfunction
我正在尝试为简单的 C 函数创建 MEX 文件,如下所示: #include #include void mexFunction(int nlhs, mxArray *plhs[], int nr
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在尝试在 mexfunctions 中使用 boost。 下面是我的代码 main.cpp #include #include #include void mexFunction(int
我想在C mexFunction中实现Matern相关函数,这需要计算第二类修正贝塞尔克函数。 在 MATLAB 中,可以使用函数 besselk。然而,任何 C 库中都没有这样的等效项(我是对的吗?
我想要 const 全局变量,但它们应该在 mexFunction() 函数中定义。这是因为它们应该设置为一些来自 Matlab 的输入值。 (mexFunction() 基本上是我的 main()
// computing the matrix operation here // resultEigen = Input matrix // result1Eigen = hidde
我有 2 个 mexfucntions(1 个 C++ 和 1 个 CUDA),它们执行相同的计算,并且我正在对它们进行比较。 现在我正在研究 CUDA mexfucntion,我需要在 .txt 上
我正在使用 Matlab 的 mex 函数来运行一些 C++ 源文件。我有几个执行不同转换的 .cpp 文件。我想制作一个头文件来调用这些 .cpp 文件。我在网上看到的所有示例(到目前为止)仅将 m
我想问一下,我们如何调试从使用 VS 2010 和 Nsight 的 mexfunction 调用的 cuda 内核。我按照 http://http.developer.nvidia.com/Nsig
我正在使用 Visual Studio 2012 x64 直接构建和调试 MATLAB 2014a x64 mex 文件(不使用 MATLAB 中的 mex 命令)。我按照 this question
我是一名优秀的程序员,十分优秀!