5

この質問が既にされている場合は申し訳ありませんが、探していたものを見つけることができませんでした。MCR/MATLAB を使用せずに (または一般的には追加のインストールを行わずに) C# で MATLAB コンパイル済み c 共有ライブラリを操作する方法があるかどうか疑問に思っていました。たとえば、この単純な関数 test.m を使用して、mcc を介して.dll を作成し、それを C# で使用します。

[x,y,z]=test(a,b,c)
%x,a are integers
%y,z,b are matrices
%c is a string (which e.g. could be used to switch between several modes)


x=a*a;
y=b*b-b;
z=y*y;

これが可能かどうかは完全にはわかりませんが(簡単なことは言うまでもありません)、この単純な例を使用しても、C#で動作させることはできませんが、これは私の非常に限られたC#経験にも関係しているかもしれません この例では、行列を処理するために IntPtr を使用する必要があると思います。つまり、次のようなものです。

[DllImport("test.dll",EntryPoint="mlfTest")]
public static extern void testfunction([In] numargout, ref IntPtr x, ref IntPtr y, ref IntPtr z, [In] IntPtr a, [In] ref double[,] b, [In] ref c)

その後、Marshal を少し操作して、x、y、z からデータを取得しようとしますか? また、かなり明白な間違いを犯していると思います。たとえば、ref double[,] を dll に渡すだけで、それが機能することを期待できるかどうかわかりません。

絶対に必要な場合は、MCR を使用できると思いますが (これにより、作業がはるかに簡単になります)、現在は制約があります。

よろしくお願いします。

4

2 に答える 2

1

他の人が述べているように、MATLAB Compiler で生成されたものには MCR が必要です。

MATLAB と C# を統合するもう 1 つのオプションは、MATLAB COM Automationを使用することです。例については、ここを参照してください。

using System;

namespace testMATLAB
{
    class Program
    {
        static void Main(string[] args)
        {
            MLApp.MLAppClass matlab = new MLApp.MLAppClass();

            System.Array pr = new double[4];
            pr.SetValue(11, 0);
            pr.SetValue(12, 1);
            pr.SetValue(13, 2);
            pr.SetValue(14, 3);

            System.Array pi = new double[4];
            pi.SetValue(1, 0);
            pi.SetValue(2, 1);
            pi.SetValue(3, 2);
            pi.SetValue(4, 3);

            matlab.PutFullMatrix("a", "base", pr, pi);

            System.Array prresult = new double[4];
            System.Array piresult = new double[4];

            matlab.GetFullMatrix("a", "base", ref prresult, ref piresult);
        }
    }
}
于 2012-07-11T12:47:09.307 に答える