C# 从.net多次调用matlab
似乎不可能多次调用matlab:C# 从.net多次调用matlab,c#,.net,matlab,C#,.net,Matlab,似乎不可能多次调用matlab: [STAThread] static void Main(string[] args) { IList<DTO> LotsOfWork = new List<DTO>(); // create some work for(int c = 0; c < 10; c++) { LotsOfWork.Add(new DTO(){ Id = c, Parameter1 = c, Parameter2
[STAThread]
static void Main(string[] args)
{
IList<DTO> LotsOfWork = new List<DTO>();
// create some work
for(int c = 0; c < 10; c++)
{
LotsOfWork.Add(new DTO(){ Id = c, Parameter1 = c, Parameter2 = c });
}
// deal with work
foreach (DTO DTO in LotsOfWork)
{
MLApp.MLApp matlab = new MLApp.MLApp();
object result;
matlab.Execute("clear;");
matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
matlab.Execute("result = a + b;");
matlab.GetWorkspaceData("result", "base", out result);
}
}
public class DTO
{
public int Id { get; set; }
public double Parameter1 { get; set; }
public double Parameter2 { get; set; }
public string Result { get; set; }
}
我还想知道是否有可能运行类似于“线程化”的东西(即为每个DTO对象生成一个线程)。谢谢。解决方案。替换:
object result;
与:
这是Mathworks的回复:
导致此错误的原因是GetWorkspaceData预期输出参数为空变量,但在运行循环一次后,结果实际上变成了值为0.0的双精度值。因此,您需要将循环更改为:
foreach (DTO DTO in LotsOfWork)
{
object result = null; //Initialize as null
matlab.Execute("clear;");
matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
matlab.Execute("result = a + b;");
matlab.GetWorkspaceData("result", "base", out result);
}
@Felix K.我已经编辑了答案。如果你能重新考虑你的否决票,我将不胜感激。@Felix K.我知道你的意思,但你自己去检查一下。如果删除“=null”(将断点设置为:matlab.Execute(“clear;”;)),则第一次迭代后局部变量结果不为null。1+正确,您是正确的。这让我大吃一惊,因为我一直认为当它在循环上下文中声明时将为null。似乎我从来没有经历过一个错误,它是由循环中的对象缺少初始化引起的。谢谢。是的,很奇怪。我相信这更像是一个.Net问题,但还有其他一些奇怪的matlab怪癖:
object result = null;
foreach (DTO DTO in LotsOfWork)
{
object result = null; //Initialize as null
matlab.Execute("clear;");
matlab.PutWorkspaceData("a", "base", DTO.Parameter1);
matlab.PutWorkspaceData("b", "base", DTO.Parameter2);
matlab.Execute("result = a + b;");
matlab.GetWorkspaceData("result", "base", out result);
}