Matlab スクリプトに、大規模な非スパース配列に作用する複雑なコード ブロックがあります。コードは、読み取り操作だけでなく、配列内のランダムな要素に対して多くの書き込み操作を実行します。同一のコードは、異なる (大きな) 配列 (つまり、異なる配列変数名を除いて同じコード ブロック) に対して実行する必要があります。
配列名だけが異なる、長くて重複したコード ブロックは必要ありません。
残念ながら、操作を実行する関数を作成して、コード ブロックが 1 回だけ表示されるようにすると、パフォーマンスが 10 倍以上低下します (おそらく配列のコピーが原因です)。ただし、配列をコピーする必要はありません。関数呼び出しの目的は、コードブロックの重複を避けるためだけになるように、「参照渡し」を好むでしょう。ただし、コピーオンライトのセマンティクスを回避する方法はないようです。
また、スクリプトには呼び出し元のスクリプトと同じ変数名が含まれている必要があるため、これを実現するためにスクリプト (関数ではない) を作成することは (私が理解している限り) 不可能です。そのため、配列ごとに異なるスクリプトが必要になります。何も得られないスクリプトを実行したいと思います (それでもコード ブロックが重複します)。
目的の配列変数名を「置き換える」エイリアス変数名を作成することを検討しました。その場合、スクリプトを呼び出してコードの重複を避けることができます。ただし、Matlab でエイリアスを作成する方法が見つかりません。
最後に、関数を利用する関数を作成し、配列変数の文字列evalin()
名をこの関数に渡すことを試みましたが、これは機能しますが、パフォーマンスも大幅に低下します-配列を値で関数に渡すのとほぼ同じです(少なくとも 10 倍の性能低下)。
私は、Matlab がコード ブロックの重複を回避する可能な手法を使用して提示する恐ろしいオーバーヘッドを回避するために、非スパース配列で複雑な操作を実行するときにコード ブロックの重複を回避することは不可能であるという結論に達しています。
これは信じがたいことですが、それを回避する方法が見つかりません。
Matlab で複数の非スパース配列に対して同一の複雑な操作を実行するときに、コード ブロックの重複を回避する方法を知っている人はいますか?