MATLB Data API for .NETにて構造体のデータ型を送受信する方法
4 次查看(过去 30 天)
显示 更早的评论
お疲れ様です。
MATLAB Compiler SDKを用いて、MATLAB関数をパッケージ化し、.NETアセンブリに統合したいと考えています。
その際、構造体のデータ型のやりとりを行いたいと考えています。
テストコードを作成してデータの送受信を行おうとしてみたところ失敗し、visual studio 2022側に以下のエラーが出ました。
Errorコード:CS1503 引数~は'out 構造体タグ名'から'out dynamic'へ変換することはできません。
そのため、構造体データ型のデータ送受信を行うチュートリアル等をご教授いただければと思います。
0 个评论
采纳的回答
Kojiro Saito
2024-1-9
こちらのドキュメントの末尾が参考になります。
For MATLAB types that do not have a corresponding C# type, such as struct or dictionary, the generated type is dynamic.
MATLABからのリターン値が構造体の場合は、dynamicデータ型で定義する必要があります。
また、MATLABデータAPIの場合の.NETとのデータのやり取りは扱うドキュメントは、「MATLAB 関数への .NET データ型の受け渡し」や「Use MATLAB Structures in .NET」にありますが、.NETの構造体をMATLABに直接入れることはできないため、MathWorks.MATLAB.Types.MATLABStructを使って.NET内でMATLABの構造体を定義する必要があります。
.NETからMATLABの構造体を引数に渡して関数を呼び出し、出力として構造体を受け取るC#のコード例は下記のとおりです。
Program.cs 抜粋
// % MATLABStructを使ってC#の中で構造体を作成
int[] myarr = new int[] { 1, 2, 3 };
MATLABStruct in1 = new MATLABStruct(("field1", myarr));
// % 出力として返ってくる構造体をdynamicで受け取る
dynamic out1;
MATLABFunctions.testStruct(matlab, in1, out out1);
// % 構造体のフィールド(field1)を取得
int[] fieldlValue = out1.GetField("field1");
// % 画面に出力 (1 2 3 が出力される)
Array.ForEach(fieldlValue, Console.WriteLine);
構造体を入出力にするMATLAB関数のサンプル (testStruct.m)
function out = testStruct(str)
if isstruct(str)
out = str;
end
end
3 个评论
Kojiro Saito
2024-1-11
argumentsに実数の{mustBeReal}を指定することで、自動生成されるstrongly_typed_interfaceフォルダー内のtestStruct.csがSystem.Numerics.Complexからdoubleになります。サイズを指定しないとdynamicになってしまうため、(1,1)などで配列を指定しておく必要があります。
testStruct.m
function [out1,out2]= testStruct(str,num)
arguments(Input)
str struct
num (1,1) double {mustBeReal}
end
arguments(Output)
out1 struct
out2 (1,1) double {mustBeReal}
end
if isstruct(str)
out1 = str;
end
out2 = num;
end
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Deploy to .NET Applications Using MATLAB Data API for .NET 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!