问题描述:
Matlab可编译供.net调用的dll。两种不同环境对数据类型的定义相差较大,因此在C#中调用Matlab编译的函数时,首先要将C#中的变量类型转换成与Matlab对应的中转类型。Matlab中的变量一般以矩阵形式表示,编译成.net dll后,通过MathWorks.MATLAB.NET.Arrays命名空间中的一系列类型来中转C#数据类型(如MWArray)。

C#中的简单数值、一维数组和二维数组可以隐式转换成MWNumericArray类型,因此在C#中可以很方便的定义用于调用Matlab函数的参数,如:
MWNumericArray a = 1.0; // 简单数值
MWNumericArray b = new Double[] {1.0, 2.0, 3.0 }; // 一维数组
MWNumericArray c = new Double[,] { {1.0, 2.0 }, {3.0, 4.0} }; // 二维数组,表示2*2的矩阵

根据简单调研,一般帖子上都会说一维、二维甚至多维矩阵的赋值原理类似,可参照低纬数组进行操作。我们在开发中很想当然的认为,三维数组应该也可以像二维矩阵一样定义和赋值,于是先定义了一个480*640*3的三维数组(用以传递图像数据):
double[,,] d = new double[480,640,3];
(...赋值过程省略...)
MWNumericArray e = d;

运行后出错了,经过调试,返现上一步中,想当然的480*640*3三维矩阵,赋值给MWNumericArray对象e后,变成了640*3*480矩阵,维度顺序完全跟预想的不一致。

原因分析:
后来在Matlab官方手册中发现”Rules for Data Conversion Between .NET and MATLAB“,其中对.net和Matlab多维数组有这么一段描述:“MATLAB and .NET implement different indexing strategies for multidimensional arrays. When you create a variable of type MWNumericArray, MATLAB automatically creates an equivalent array, using its own internal indexing. ”,说明Matlab和.Net在矩阵存储和索引的方式是有差异的。

以下是“Conversion Results: .NET Types to MATLAB Types”中的对照信息:

其中M、N代表行数、列数,P1...Pn表示Page1到Page n。在.Net中,多维数组Page在前(顺序从n到1),行列数在后,而Page在后(顺序从1到n),因此我们给480*640*3的Matlab矩阵类型赋值,需要定义一个3*480*640的三维数组,如:double[,,] d = new double[3,480,640]。 这也解释了之前为何二维矩阵(只有M、N,没有P)的赋值过程不会出错,而三维矩阵却不对。

参考内容:
1、Rules for Data Conversion Between .NET and MATLAB
http://cn.mathworks.com/help/compiler_sdk/dotnet/rules-for-data-conversion-between-net-and-matlab.html?searchHighlight=MWNumericArray%20.NET&s_tid=doc_srchtitle
2、Data Conversion Between .NET and MATLAB
http://cn.mathworks.com/help/compiler_sdk/dotnet/data-conversion-between-net-and-matlab.html?searchHighlight=MWNumericArray%20.NET&s_tid=doc_srchtitle

Matlab与.Net混合编程-多维数组赋值出错的问题的更多相关文章

  1. Matlab与C++混合编程(依赖OpenCV)

    Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

  2. [转] Matlab与C++混合编程(依赖OpenCV)

    作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

  3. 【目录】Matlab和C#混合编程文章目录

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...

  4. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  5. Matlab与.NET混合编程解决人脸识别问题

    原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

  6. matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  7. matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

    matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

  8. [转] Matlab与C++混合编程,添加OpenCV库

    原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...

  9. Matlab与C++混合编程,添加OpenCV库

    最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...

随机推荐

  1. MinGW安装和使用(不是mingw-w32)

    MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C++.ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便.MinGW提 ...

  2. Acdreamoj1116(Gao the string!)弦hash+二分法+矩阵高速功率

    Problem Description give you a string, please output the result of the following function mod 100000 ...

  3. 西门子S7报文解析

    1.报文的基本格式 1.1 第1和第2个字节是:固定报文头03 00,这里我们就用到三种报文: a.初始化 b. 读 c.写,都是这种格式: 1.2 第3和第4个字节是:整个报文的长度: 其它部分就是 ...

  4. 1 Quartz开始

    三个比较像的玩意儿 Quartz      Windows计划任务    timer(主要用到了线程池技术) quartz.net 是从java的quartz项目移植过来的  java版本 www.q ...

  5. OpenGL(二十四) VAO、VBO和着色器使用示例

    1. 新建一个工程,新建一个头文件Shader.h,内容如下: #ifndef _SHADER_H_ #define _SHADER_H_ #include <vector> #inclu ...

  6. Windows下一个curl使用

    一.简介 在上一篇中我们涉及到了一个在Ubuntu下使用的curl命令,而且使用这个命令来模拟server的功能来向谷歌的C2DMserver发送数据. 以下简单的来说下在Windows下相同的使用c ...

  7. 傻瓜突破linux--rootpassword

    破password该方法: 方法1.单用户模式改动 (表示进入到单用户模式) ,按回车键,按b键启动.进入单用户模式.进行password改动,重新启动 init 5 口诀:e2e 空格1 回车b 开 ...

  8. 关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)

    http://www.cnblogs.com/-wang-cheng/p/4973021.html 1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: 1 QCoreApplicato ...

  9. asp .net core 使用spa

    要求 .net core 2.1 引用包 Microsoft.AspNetCore.SpaServices 先在angular目录下执行 npm i npm run build 关键代码 servic ...

  10. LeapMotion Demo1

    原文:LeapMotion Demo1     LeapMotion SDK For c# 只提供了一个Sample.cs.   Leap Motion App Home 可以给初入手者提供很好的用户 ...