0

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 = 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; }
}

2回目のループ反復では、例外がスローされます。

at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at MLApp.DIMLApp.GetWorkspaceData(String Name, String Workspace, Object& pdata)
at Sandbox.Program.Main(String[] args) in C:\Bla\Program.cs:line 53
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

また、この「スレッド化」のようなものを実行できるかどうかも疑問に思っています(つまり、各DTOオブジェクトのスレッドを生成します)。ありがとう。

4

1 に答える 1

2

解決。交換:

object result;

と:

object result = null;

これはMathworksの応答です:

このエラーは、GetWorkspaceDataが出力パラメーターとして空のVARIANTを予期しているが、ループを1回実行した後、結果が実際には値0.0のdoubleになっていることが原因で発生します。したがって、ループを次のように変更する必要があります。

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);
}
于 2012-09-05T14:42:17.100 に答える