3

いくつかのカスタムデータを並べ替えるために、matlabで小さなクイックソート実装を作成しました。セル配列を並べ替えており、並べ替え順序のインデックスが必要であり、セル配列自体を再構築したくないため、独自の実装が必要です(機能する実装があるかもしれませんが、見つかりませんでした) 。

left私の現在の実装は、aと配列に分割し、rightこれらの配列を再帰呼び出しに渡すことで機能します。leftとのサイズがわからないのでright、MATLABではひどく遅いことがわかっているループ内でそれらを成長させます。

インプレースクイックソートを実行できることは知っていますが、参照による呼び出しがmatlabで期待されるように実装されていないため、関数に渡される変数の内容を変更しないように警告されました(またはそう言われました)。これは正しいです?インプレースクイックソートはmatlabで期待どおりに機能しますか、それとも私が世話をする必要があるものがありますか?この種のことを実装するために、他にどのようなヒントがありますか?

4

2 に答える 2

4

この投稿では、MATLAB関数呼び出し規約についてのみ説明し、クイックソートアルゴリズムの実装については説明しません。

関数を呼び出すとき、MATLABは組み込みのデータ型を値で渡し、そのような引数に加えられた変更は関数の外部には表示されません。

function y = myFunc(x)
    x = x .* 2;         %# pass-by-value, changes only visible inside function
    y = x;
end

これは、特に関数内で変更されていない場合、大きなデータには非効率的である可能性があります。したがって、MATLABは内部でコピーオンライトメカニズムを実装します。たとえば、ベクトルがコピーされると、一部のメタデータのみがコピーされ、データ自体はベクトルの2つのコピー間で共有されます。そして、データが実際に複製されるのは、そのうちの1つが変更されたときだけです。

function y = myFunc(x)
    %# x was never changed, thus passed-by-reference avoiding making a copy
    y = x .* 2;
end

セル配列と構造の場合、変更されたセル/フィールドのみが値渡しされることに注意してください(これは、セル/フィールドが内部で個別に格納されるためです)。これにより、このようなデータ構造のコピーがより効率的になります。詳細については、このブログ投稿をお読みください。

さらに、バージョンR2007以降(私は思う)は、データに対するインプレース操作を検出し、そのような場合を最適化します。

function x = myFunc(x)
    x = x.*2;
end

明らかに、そのような関数を呼び出すとき、LHSはRHS()と同じでなければなりませんx = myFunc(x);。また、この最適化を利用するには、インプレース関数を別の関数の内部から呼び出す必要があります。

MEX関数では、コピーを作成せずに入力変数を変更することは可能ですが、公式にはサポートされておらず、予期しない結果が生じる可能性があります...

ユーザー定義型(OOP)の場合、MATLABは、参照セマンティクスをサポートする値オブジェクトとハンドルオブジェクトの概念導入ました。

于 2011-08-29T17:15:47.100 に答える