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++上又不太实际,故采用联合编程的方式,速度难 ...
随机推荐
- .NET 即时通信,WebSocket
.NET 即时通信,WebSocket 即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s ...
- 使用JScript脚本批量修改VC工程设置
作者:朱金灿 来源:http://blog.csdn.net/clever101 很多时候升级了第三方库,需要对很多工程修改设置.在VS中按住Ctrl键确实可以多选工程,但通过这样做也有麻烦的地方:一 ...
- Java--Vector类
Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...
- Qt图片自适应窗口控件大小(使用setScaledContents)
最近在用Qt设计一个小程序,想让一幅图片自适应窗口大小,由于本人比较笨,一直找不到好方法.找到了很多方法但都会出一些小问题, 刚刚摸索出解决办法了,在些记录. 思想: 1 显示图像是用QLabel2 ...
- 格式字符串分配stl::string
代码非常easy,不解释,直接在代码: #include <cstdio> #include <cstdarg> #include <iostream> using ...
- wpf XMAL中隐藏控件
原文:wpf XMAL中隐藏控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a771948524/article/details/9264569 ...
- RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)
服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出. 这样能实现通讯,但有个问题.如何知道更多信息?比如需要发送流大小,编码,Ip等. 这 ...
- Emgu-WPF学习使用-识别二维码的位置
原文:Emgu-WPF学习使用-识别二维码的位置 参考链接:http://blog.csdn.net/gaobobo138968/article/details/47663607 我完全参 ...
- 基于IdentityServer4的单点登录——Client
以MvcClient项目为例 1.新建项目并添加引用 新建一个asp .net core 2.0的项目引用IdentityModel 2.配置 比之前的控制台客户端多这个步骤,需要配置这个客户端的Cl ...
- Post ,Get 请求
http://blog.csdn.net/pan_junbiao/article/details/9155497