2

MATLAB のコーダー ツールを使用して、行列指数関数の MEX バージョンを作成し、別の関数セットで使用しました。問題は、MEX バージョンでは元の m ファイルとは異なる結果が得られることです。

デバッグした結果、これは MEX ファイルと m-file が同じように行列の除算 (\) を行っていないことが原因であると考えています。または、そもそも MEX ファイルに問題があります。行列の除算が行われる行までのすべての変数は、両側で同等です。

これは、問題が発生する行です。

F = (V-U)\(2*U) + I

ここで、I は V と U のサイズの単位行列です。

MEX ファイルが行列除算を行うときの不一致の背後にある理由は何ですか? また、この問題を修正するにはどうすればよいですか? このコード行を分割せずに書き直すことはできますか?

4

2 に答える 2

4

このような操作から C コードを生成することに問題はありません。

これが私が試したテスト機能です:

myfcn.m

function F = myfcn(U,V)
    I = eye(size(U));
    F = (V-U)\(2*U) + I;
end

結果を検証するために使用するテスト スクリプトを次に示します。

test_myfcn.m

U = rand(5);
V = rand(5);
F = myfcn(U,V);

まず、コード生成ツール ( ) を起動しccoder、MEX ファイルを生成する新しいプロジェクト セットを作成してmyfnc.mから、前の関数をエントリポイントとして追加します。次に、両方の入力変数の型を次のように定義します。

double (:Inf x :Inf)

double 型の制限のないサイズの MxN 行列を指定します。

最後に、プロジェクトをビルドできます。これにより、 が生成されmyfcn_mex.mexw64ます。

元の M 関数と生成された MEX 関数の両方をテストすると、ほぼ同じ結果が得られます (違いはマシンのイプシロンのオーダーです)。

>> F = myfnc(U,V);
>> FF = myfcn_mex(U,V);
>> norm(F-FF)
ans =
   1.4391e-14
于 2014-10-15T19:40:46.810 に答える