Matlab与.Net混合编程-多维数组赋值出错的问题
问题描述:
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混合编程-多维数组赋值出错的问题的更多相关文章
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- [转] Matlab与C++混合编程(依赖OpenCV)
作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
- 算法库:Matlab与C++混合编程
算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- [转] Matlab与C++混合编程,添加OpenCV库
原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...
- Matlab与C++混合编程,添加OpenCV库
最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难 ...
随机推荐
- FreeBSD中的SYSINIT框架【转】
SYSINIT是一个通用的调用排序与分别执行机制的框架.FreeBSD目前使用它来进行内核的动态初始化.SYSINIT使得FreeBSD的内核各子系统可以在内核或模块动态加载链接时被重整.添加.删除. ...
- MySQL九读书笔记 字符串模式匹配
当我们使用查询,条件常常会遇到模糊查询.的模糊查询相关的字符串模式匹配. 这里,主要约两:标准SQL模式匹配.扩展正则表达式模式匹配. 一.标准的SQL模式匹配 SQL的模式匹配同意你使用&q ...
- PCI GXL学习之再造篇
作者:朱金灿 来源:http://blog.csdn.net/clever101 再造一个PCI GXL?听起来是一件颇有难度的事,实际上并非不可能.本文拟从必要性.可行性和技术路线等方面谈谈再造PC ...
- unity3d 学习笔记(三)
工作现场查看: 飞行模式: 按住鼠标右键 w s a d 围绕浏览当前视图, q e 上下浏览. 交模式下无效 需透视图 移动吸附:移动状态(w) ctrl+shif 移动吸附在其它物体上移动 顶点 ...
- Android--常用框架大全
1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Android Universal Image Loader 一个强大的加载,缓存,展示图 ...
- 简明Python3教程 13.面向对象编程
简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...
- WPF 用Clip属性实现蒙板特效
原文:WPF 用Clip属性实现蒙板特效 上一篇,已简单介绍Clip属性的用法,这一篇用它来实现简单蒙板功能,很简单,直接上代码 <Window x:Class="擦除效果.MainW ...
- ajax默认form表单提交,导致实体不识别
出现位置:实体比较复杂,包含List之类的时候 public class AdvertisementType { /// <summary> /// 广告位名称 /// </summ ...
- Binding的三种方式
1 Text="{Binding Name}" Name为后台的属性 2 Text="{Binding ElementName=XXX,Path=A.B.C.D….}&q ...
- Bootstrap 固定在顶部导航条
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...