如何在.NET6 Web应用中实现C#向Matlab传数组及解决调用报错
解决方案
问题根源分析
触发异常的核心原因有三点:
- 工作目录切换错误:
cd命令指向了.m文件而非其所在文件夹,导致Matlab无法找到myfunc函数 - 数据类型不兼容:C#传入的
int32数组与Matlab默认使用的double数值类型不匹配 - 返回值数量不匹配:
Feval指定的返回结果数与Matlab函数实际返回数不一致,后续还会引发索引越界
具体修复步骤
1. 修正工作目录切换命令
cd命令需要指向包含.m文件的文件夹,而非文件路径本身:
matlab.Execute(@"cd C:\Users\user\Desktop");
2. 统一输入数组类型为double
Matlab默认以double处理数值,将C#中的int[]改为double[]:
double[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 500, 800, 14, 78, 99, 45, 201, 336, 5578 };
3. 匹配函数返回值数量
Matlab函数myfunc返回3个结果(a,b,c),需将Feval的第二个参数设为3:
matlab.Feval("myfunc", 3, out result, input);
4. 修正结果索引访问
返回的object[]长度为3,索引范围是0-2,原代码中res[3]会触发越界,改为:
Console.WriteLine(res[0]); Console.WriteLine(res[1]); Console.WriteLine(res[2]);
完整修正后的C#代码
MLApp.MLApp matlab = new MLApp.MLApp(); // 切换到包含myfunc.m的文件夹 matlab.Execute(@"cd C:\Users\user\Desktop"); object result = null; // 使用double类型数组匹配Matlab默认数值类型 double[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 500, 800, 14, 78, 99, 45, 201, 336, 5578 }; // 指定返回3个结果,与Matlab函数定义一致 matlab.Feval("myfunc", 3, out result, input); // 处理返回结果 object[] res = result as object[]; // 访问正确的索引 Console.WriteLine(res[0]); Console.WriteLine(res[1]); Console.WriteLine(res[2]); Console.ReadLine();
Matlab代码无需修改,保持原定义即可。
内容的提问来源于stack exchange,提问作者Mariam Sultan
相关产品推荐
相关产品推荐

