- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 C++ vector :
std::vector<myStruct> myVec;
其中 myStruct 包含:
struct myStruct {
Point3D start;
Point3D end;
double lenght;
}
struct Point3D {
double x, y, z;
}
现在在我的 mex 文件中,我想将其转换为 mxArray,同时保持相同的结构。
当前(非功能)代码:
// basic 'out'
mxArray *out;
mwSize dims[2] = { 1, 1 };
const char *pointField[] = {"point"};
const char *fields[] = {"start", "end","lenght"};
const char *3dFields[] = {"x", "y", "z"};
out = mxCreateStructArray(2,dims,(int)myVec.size(),pointField);
for( int i = 0 ; i < myVec.size() ; ++i)
{
// create struct to fill
mxArray *point = mxCreateStructArray(2, dims, 3, fields);
// create struct for start
mxArray *start= mxCreateStructArray(2, dims, 3, 3dFields);
mxSetField( start, 0, "x", mxCreateDoubleScalar(myVec[i].start.x) );
mxSetField( start, 0, "y", mxCreateDoubleScalar(myVec[i].start.y) );
mxSetField( start, 0, "z", mxCreateDoubleScalar(myVec[i].start.z) );
// create struct for end
mxArray *end= mxCreateStructArray(2, dims, 3, 3dFields);
mxSetField( end, 0, "x", mxCreateDoubleScalar(myVec[i].end.x) );
mxSetField( end, 0, "y", mxCreateDoubleScalar(myVec[i].end.y) );
mxSetField( end, 0, "z", mxCreateDoubleScalar(myVec[i].end.z) );
// add start + end to 'point'
mxSetField( point, 0, "start", start);
mxSetField( point, 0, "end", end);
mxSetField( point, 0, "lenght", mxCreateDoubleScalar(myVec[i].lenght) );
// add completed 'point' struct to out at given index i
mxSetField(out, i, "point", point );
}
plhs[0] = out;
如您所见,重要的是我可以有 1 个输出值,它可以包含多个“点”- 结构,其中每个点都有一个开始(xyz)结构、结束(xyz)结构和长度值。
到目前为止,此代码仅以正确的格式输出 1 个单一结构,但是对于第二次迭代,它仅在“点”所在的级别直接创建一个空的“结束”值。
我必须更改什么才能使其正常工作?
提前致谢!
最佳答案
这是我的实现:
#include "mex.h"
#include <vector>
// C++ struct
struct Point3D {
double x, y, z;
};
struct myStruct {
Point3D start;
Point3D end;
double length;
};
const char *fieldsPoint[] = {"x", "y", "z"};
const char *fieldsStruct[] = {"start", "end", "length"};
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (nrhs != 0 || nlhs > 1) {
mexErrMsgIdAndTxt("MATLAB:MEX", "Wrong number of arguments.");
}
// create C++ vector of structs
std::vector<myStruct> v;
for (int i=0; i<10; i++) {
myStruct s = {
{1.0+i, 2.0+i, 3.0+i},
{4.0+i, 5.0+i, 6.0+i},
i
};
v.push_back(s);
}
// convert it to MATLAB struct array and return it as output
mxArray *p;
plhs[0] = mxCreateStructMatrix(1, v.size(), 3, fieldsStruct);
for (int i=0; i<v.size(); i++) {
// start point
p = mxCreateStructMatrix(1, 1, 3, fieldsPoint);
mxSetField(p, 0, "x", mxCreateDoubleScalar(v[i].start.x));
mxSetField(p, 0, "y", mxCreateDoubleScalar(v[i].start.y));
mxSetField(p, 0, "z", mxCreateDoubleScalar(v[i].start.z));
mxSetField(plhs[0], i, "start", p);
// end point
p = mxCreateStructMatrix(1, 1, 3, fieldsPoint);
mxSetField(p, 0, "x", mxCreateDoubleScalar(v[i].end.x));
mxSetField(p, 0, "y", mxCreateDoubleScalar(v[i].end.y));
mxSetField(p, 0, "z", mxCreateDoubleScalar(v[i].end.z));
mxSetField(plhs[0], i, "end", p);
// length
mxSetField(plhs[0], i, "length", mxCreateDoubleScalar(v[i].length));
}
}
我们从 MATLAB 编译并调用 MEX 函数:
>> mex -largeArrayDims vec_struct.cpp
>> s = vec_struct()
s =
1x10 struct array with fields:
start
end
length
如您所见,这会创建一个 structure array长度为 10。例如,第 5 个结构被访问为:
>> s(5)
ans =
start: [1x1 struct]
end: [1x1 struct]
length: 4
>> s(5).start
ans =
x: 5
y: 6
z: 7
>> s(5).start.x
ans =
5
上述 MEX 文件等效于以下 MATLAB 代码:
ss = struct();
for i=1:10
ss(i).start = struct('x',1+i-1, 'y',2+i-1, 'z',3+i-1);
ss(i).end = struct('x',4+i-1, 'y',5+i-1, 'z',6+i-1);
ss(i).length = i-1;
end
关于C++ 对象的 C++ vector 到 mex 中的 mxArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110358/
我试图通过用 C++ 编写一些函数并使用 mex 接口(interface)来集成它们来加速我的 Matlab 程序。我在 C++ 的向量中得到了我的结果。我想将它传输到 MATLAB 中的数组。我知
我用 C++ 编写了带有服务器和客户端的 TCPIP 套接字连接,它在 VisualStudio 中工作得很好。现在我想通过 MEX 文件在 MATLAB/Simulink 中使用 C++ - 客户端
我有返回 C++ 主机端数组的 cuda/C++ 代码。我想在 MATLAB 中操作这些数组,所以我用 mex 格式重写了我的代码并用 mex 编译。 我通过将预分配的数组从 MATLAB 传递到 m
我正在尝试将一段代码从 Matlab 转换为 python。我正在运行 Ubuntu 16.04LTS,需要依靠 Octave 来运行引用代码(Matlab 安装时出现深奥错误)。无论如何,以前从未使
我使用 VS2010 C-编译器在 Windows8 上开发了一个 Matlab mex 文件。很长一段时间,一切都很顺利…… 但是现在,mex 文件会阻止代码中的所有更改。无论我更改哪一行代码,重建
我的 C 代码应该将 Matlab 稀疏格式转换为 TAUCS format 也是列的主要格式。 当然,我是在 Matlab 本身生成 Matlab 稀疏格式,然后将其传输到 mex 文件。 代码编译
这是我编写的用于在制表符分隔文件中读取的 mex 代码。 mex 文件已创建,但它导致我的 MATLAB 突然结束并给出以下错误。谁能帮助我哪里出错了?如果需要任何进一步的信息,请告诉我 异常终止:分
我有一个 Matlab mex 函数,它重复调用名为 calculate(). 的 C 函数我制作了两个版本的函数: 版本A:每次mex()来电 calculate() ,它只传递输入参数,以及cal
我正在尝试在 MATLAB 中构建一个 mex 函数。该函数依赖于 C++ 库。但是,无论我做什么,我都会在 MATLAB 中得到 Unresolved external 问题。我创建了三个简单的文件
我正在尝试从 C++ 源代码编译一些 MATLAB MEX 文件。我正在尝试编译的文件 can be found here ;我在 32 位系统 MATLAB 2012a 上使用 Windows XP
我使用 mxCreateSparse 在 MEX 中创建了一个稀疏矩阵. mxArray *W; W=mxCreateSparse(n*n,n*n,xsize,mxREAL); double *wpo
我正在尝试在 C 语言的 MEX 文件中实现一些基本的线性代数例程以进行练习,但我被点积困住了。这是我到目前为止所拥有的: #define char16_t UINT16_T //shenanigan
我是编写 MEX 函数的新手,我有内存问题。 MEXf 逍遥法外的套路如下: void mexFunction (int nlhs, mxArray *plhs[], int nrhs,const m
我这里有一个可以正确执行的 C mex 文件,但是在执行完成后 MATLAB 因段错误而崩溃。由于它在程序完成执行后崩溃,这让我认为 MATLAB 自动释放分配的内存导致了这个问题。但是,我释放了我自
我有一个简单的 mex 函数,它从库中调用另一个 C++ 函数。我用编译源代码 mex -cxx mymexfunction.cpp -I/some/include -L/some/lib -lmyl
我正在寻找一种算法来找到 mex但除了这个 wiki 链接,找不到任何有用的东西。 看完后我拉出这段代码: nList = [int(x) for x in input().split()] nLis
我希望仅在通过 Matlab 中的 mex 命令编译我的代码时包含某个头文件。如果它是直接用 Visual Studio 编译的,我不希望包含它。 是否有一个宏可以帮助解决这个问题? 我想做这样的事情
如何在用 C 编写的 MEX 文件中创建二维稀疏矩阵。创建矩阵后如何像在 C 中一样单独访问元素,比如 mat[i][j]? 我厌倦了使用 mxCreateNumericArray函数,但我无法访问元
我正在尝试编译 a matlab wrapper for libdc1394这是一个用于火线相机的库。我收到一个奇怪的错误,涉及头文件中的一些内联函数。我正在使用 gcc-4.6 开发 ubuntu
我需要尽快将大量数据写入磁盘。在 MATLAB 中,我可以使用 fwrite 来做到这一点: function writeBinaryFileMatlab(data) fid = fopen(
我是一名优秀的程序员,十分优秀!