2015-12-01 10 views
5

のすべての要素をMATLABで合計しています。配列値式

sum((A-2*A)(:)) 

ではなく、我々がする必要がある、有効なMATLABの構文ではありませんように、それは、(:)はもう動作しない式になったら、いくつかの配列変数A上で総括すると、しかし同じくらい簡単

として
sum(A(:)) 
% or 
sum(...sum(sum(A,n),n-2)...,1) % where n is the dimension of A 

ですAの寸法が固定されている場合は、1つのライナーは上記のみ、動作します

foo = A-2*A; 
sum(foo(:)) 
%or the one liner 
sum(sum(...sum(A-2*A,n)...,2),1) % n is the dimension of A 

書くあなたは何をしているかに依存しており、必要ないかもしれません事件である。 2行の欠点は、fooがclear fooを実行するまでメモリ内に保持されるか、Aのサイズやその他の作業スペースに応じて実行できないことがあります。

この問題を回避し、一時変数を作成せずに、配列値の式のすべての要素を1行にまとめる一般的な方法はありますか? sum(A-2*A,'-all')のようなもの?

編集:それは懸念の一般的な(また、特定の)配列大切な表現や戻り値のインデックスではなく、それぞれの可能なインデックスを超える合計しないように、それは、How can I index a MATLAB array returned by a function without first assigning it to a local variable?からdifferes。

リンクで与えられた答えで私の問題を解決することは可能ですが、gnoviceはsubrefを使用することはむしろ醜い解決策であると自分自身に言います。さらに、Andras Deak氏は以下のコメントでこれを行うためのきれいな方法を紹介しました。

+1

なぜ一時変数を避けたいのですか?それはスピードの面でもRAMの面でも重要ではありません(同じ変数は、とにかく 'sum'コールで生成されます)。大規模な行列の再構成には多くの時間がかかるため、 'sum(sum) 'が高速になると思います。 – Adriaan

+1

@ダニエル私は、この質問には重複に関係しない簡単な答えがあると思う: 'sum(reshape(A-2 * A、1、[]))'。私が答えられるように同意するならば、再度開いてください。 –

+0

@AndrasDeakどちらのバージョンも動作しますが、あなたは 'subref'を使ってよりクリーンなものに見えます。この場合、質問を再度開く価値はありますか? (私はここで適切な行動規範については確信していません。) –

答えて

10

the linked duplicateへの回答は確かにあなたの問題に適用できますが、質問の範囲が狭いほど、そこに用意されている回答よりはるかに簡単な解決策が得られます。

あなたが1Dに最初にあなたのアレイを再形成することにより、(関数の戻り値を含む)式のすべての要素を合計することができます

sum(reshape(A-2*A,1,[])) 
%or even sum(reshape(magic(3),1,[])) 

これはサイズ[1, N]Nにあなたの配列値式を再構築します配列のサイズ、つまりnumel(A-2*A)から推測されます(しかし、上記の構文reshapeは欠落した次元を計算します。式を2回評価する必要はありません)。 sumへの1回の呼び出しでは、必要に応じてすべての要素が合計されます。あなたは、一時的な作り(匿名関数でその合計を使用したい機能は次元の未知の数と配列を返すとき

あなたはこのような何かに頼らを持っている実際のケースは、です変数を使用できません):

fun = @() rand(2*ones(1,randi(10))); %function returning random 2 x 2 x ... x 2 array with randi(10) dimensions 
sumfun = @(A) sum(reshape(A,1,[])); 
sumfun(fun()) %use it