我们知道matlab中的矩阵是列优先存储的,而c++中的数据是行优先存储的,而习惯了使用c++的伙伴们,也习惯了行优先存储方式了啦(比如看一个二维数组,总会先看行序号,再看列序号)。所以在进行c++调用matlab引擎处理时,这会给两者矩阵数据传递会带来诸多的烦恼,这也是诸多程序bug的来源之一。关于c++调用matlab引擎编程,可参考我的另一篇文,网址为http://blog.csdn.net/feichizhongwu888/article/details/47277565。
下面举一个例子,说明c++的数据存储顺序和matlab的存储数据方式。
int main()
{
//c++ matrix:2*5=10 elements
double a[10] = {0,1,2,3,4,5,6,7,8,9};
Engine* ep;
if(!(ep = engOpen(NULL)))
{
std::cout<<"can't start Matlab Engine!!"<<std::endl;
return EXIT_FAILURE;
}
engSetVisible(ep, true);
//generating matlab matrix::aa
mxArray *aa = mxCreateDoubleMatrix(2, 5, mxREAL);
memcpy(mxGetPr(aa), a, 10 * sizeof(double));
engPutVariable(ep, "aa", aa);
std::cin.get();
engEvalString(ep, "clear;");
mxDestroyArray(aa);
engClose(ep);
return 0;
}
c++中有一个2*5的矩阵,总共10个元素,存储在a[10]里面,如代码所示,之后,将a[10]元素全部传递给matlab变量aa,我们希望matlab能构造一个矩阵:第一行为{0,1,2,3,4}第二行为{5,6,7,8,9},但事实并非如此。程序输出结果,在matlab command window测试aa的值为:
你会发现0-9个元素,是纵向依次填充到2*5的matlab矩阵当中的,这是说明了matlab是列优先存储。
因此,如果你希望matlab构造你理想的矩阵,就必须在c++