この投稿では、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は、参照セマンティクスをサポートする値オブジェクトとハンドルオブジェクトの概念を導入しました。