のすべての要素を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氏は以下のコメントでこれを行うためのきれいな方法を紹介しました。
なぜ一時変数を避けたいのですか?それはスピードの面でもRAMの面でも重要ではありません(同じ変数は、とにかく 'sum'コールで生成されます)。大規模な行列の再構成には多くの時間がかかるため、 'sum(sum) 'が高速になると思います。 – Adriaan
@ダニエル私は、この質問には重複に関係しない簡単な答えがあると思う: 'sum(reshape(A-2 * A、1、[]))'。私が答えられるように同意するならば、再度開いてください。 –
@AndrasDeakどちらのバージョンも動作しますが、あなたは 'subref'を使ってよりクリーンなものに見えます。この場合、質問を再度開く価値はありますか? (私はここで適切な行動規範については確信していません。) –