2017-04-20 16 views
1

まず、この優れたarticleを既に見てきました。 私はsdpと呼ばれるMATLABスクリプトを持っています。私はtrackと呼ばれる別のMATLABスクリプトを持っています。 tracksdpの後に実行します。trackは、sdpの出力の一部を使用しています。トラックを走らせるために、私はactionという関数を何度も呼び出す必要があります。私はactionを別のMATLABファイルの関数として定義しています。このactionの各呼び出しには、いくつかの入力があります。たとえば、x1,x2,x3ですが、x2,x3は変更されない単なる「データ」です。彼らはtrackと同じsdpで同じであり、actionに同じままです。ここでは、x2,x3は巨大な行列です。そしてグローバル変数の代替:MATLABの永続変数とネストされた関数

x2,x3,...x10ように思う)そこの多くのラメの方法は、SDPで、その後、トラックにグローバルとしてx2,x3を定義することですので、私は唯一のx1でアクションを呼び出すことができます。しかし、これは私のパフォーマンスを信じられないほど遅くします。 が何であるかを覚えておくために、どうすればよいでしょうか?それぞれの呼び出しは非常に高速です。たとえば、これをインラインで実行すると、超高速です。

おそらく私はいくつかの永続変数を使用できます。しかし、私は彼らが私の例に当てはまるかどうか正確には分かりません。私はそれらを正確に使う方法も知らない。

答えて

0

object oriented programming in Matlabをご覧ください。メンバー変数x2 ...sdpの結果に割り当てるactionオブジェクトを作成します。次にのメソッドを呼び出すことができるのはx1です。オブジェクトは状態を持つ関数と考えることができます。ここでの状態情報は定数の結果であるsdpです。

これを行うもう1つの方法は、actionfunction handleとして追跡する機能的アプローチを使用することです。ここでは、trackという変数を操作できます。

+0

オブジェクト指向プログラミングの方が高速でしょうか?わからない。あなたは永続的な変数やこれらの関数のネストに精通していますか、それはおそらく関連していますか? – bissi

0

MATLABで大きな行列を渡すことは効率的です。意味的にはcall-by-valueを使用しますが、変更されるまで呼び出すように実装されています。不変のパラメーターをすべてパラメーターの構造体にラップして渡します。

params.x2 = 1; 
params.x3 = [17 39]; 
params.minimum_velocity = 19; 

action('advance', params); 

すでにグローバルがうまく機能していないことがわかりました。変数を隠す構文的な砂糖をどこかで心配しないでください...入力がどこから来ているのかを明確に見ていくことには利点があり、パフォーマンスは良くなります。

このアプローチでは、実行の説明、実行された時間などの新しいデータメンバー、または補助メタデータも簡単に追加できます。構造体を組み合わせて、さまざまなパラメータを持つ複数の実行を記述することができます。

+0

この構造のパラメータは美学的な構造にすぎませんか、それともパフォーマンスにもプラスの影響を与えますか?これは、x2とx3を渡すだけで、paramsパラメータにそれらを隠すのと同じではありませんか? スクリプトファイルのトラッキングにアクションを貼り付けると、コードはフラッシュで実行されます。アクションを複数回呼び出すと信じられないほど遅くなります。 – bissi

+0

これは関数呼び出しのオーバーヘッドのようです。パラメータの受け渡しはおそらく問題ではありません。関数はスクリプトよりも最適化されるので、すべてが関数であることを覚えておいてください。 – Peter

関連する問題