MATLB Data API for .NETにて構造体のデータ型を送受信する方法

조회 수: 6 (최근 30일)
啓嗣
啓嗣 2024년 1월 5일
댓글: 啓嗣 2024년 1월 11일
お疲れ様です。
MATLAB Compiler SDKを用いて、MATLAB関数をパッケージ化し、.NETアセンブリに統合したいと考えています。
その際、構造体のデータ型のやりとりを行いたいと考えています。
テストコードを作成してデータの送受信を行おうとしてみたところ失敗し、visual studio 2022側に以下のエラーが出ました。
Errorコード:CS1503 引数~は'out 構造体タグ名'から'out dynamic'へ変換することはできません。
そのため、構造体データ型のデータ送受信を行うチュートリアル等をご教授いただければと思います。

채택된 답변

Kojiro Saito
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
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
啓嗣
啓嗣 2024년 1월 11일
無事解決できました。早急な回答ありがとうございました。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 MATLAB Compiler SDK에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!