0

MATLAB R2015a次のコード ( )を持つ関数から MEX をコンパイルしたいと考えています。

function r = MyFunc(x,type)
    ind = randi(numel(x), 1);
    getInd = @getIndFixed;
    if strcmpi(type, 'random')
        ind = numel(x);
        getInd = @getIndRandom; % error here
    end
    x(getInd(ind)) = 1;
end
function k = getIndFixed(n)
    k = n;
end
function k = getIndRandom(n)
    k = randi(n, 1);
end

上記で指定した行とのtype mismatch間でエラーが発生します。getIndFixedgetIndRandom

型の不一致: function_handle getIndFixed ~= getIndRandom.

  • この問題を回避する方法はありますか?
  • たとえば、両方の関数が同じ署名を持つことを指定する方法はありますか?

C では、関数のシグネチャは次のようになります。

int (*getInd)(int);
int getIndFixed(int);
int getIndRandom(int);
//...
getInd = getIndFixed;
getInd = getIndRandom;
4

1 に答える 1

0

コード生成で関数ハンドルを割り当てた後で、関数ハンドルを別の関数に変更することはできません。「C」とは異なり、これらの関数呼び出しはコンパイル時に解決されます。type入力が定数の場合、コードを次のように書くことができます

function r = MyFunc(x,type)
    if strcmpi(type, 'random')
        ind = numel(x);
        getInd = @getIndRandom; % error here
    else
        ind = randi(numel(x), 1);
        getInd = @getIndFixed;
    end
    x(getInd(ind)) = 1;
end

定数でない場合typeは、すべてを if または else ブランチ内に移動する必要があります。

于 2016-08-24T16:56:03.370 に答える