1

次の Matlab 構文が機能しない理由を解決しようとしています。

  1. 配列 A = [2 3 4 5 8 9...] があります。
  2. たとえば、s(1) = 2; のように、インデックス付きの累積を作成したいと考えています。s(2)=5、s(3)=9; ... 等々

誰かが以下が機能しない理由を説明できますか

x = 1:10
s(x) = sum(A(1:x))

論理は、ベクトルが x を使用して s に対して作成される場合、sum 関数が同じように動作しないのはなぜでしょうか? 上記は、すべての x の最初の要素 (2) だけを返します。

4

3 に答える 3

4

累積合計を計算するには、次を使用する必要がありますcumsum

>> A = [2 3 4 5 8 9]

A =

     2     3     4     5     8     9

>> cumsum(A)

ans =

     2     5     9    14    22    31

問題は、1:x線形アレイ1を削減することです。sumこれを適切に行うには、2 次元配列が必要で、行を合計します。

s(x)=sum(triu(repmat(A,[prod(size(A)) 1])'))
于 2013-10-17T02:28:06.843 に答える
0

あなたは本当に2つの質問をしています。1 つは、累積合計を計算する方法です。@SouldEcの答えは、cumsum関数がそれを行う方法をすでに示しています。あなたの他の質問は

誰かが以下が機能しない理由を説明できますか

x = 1:10
s(x) = sum(A(1:x))

それは合理的です - あなたはベクトル展開が変わるべきだと思います

1:x

の中へ

1:1
1:2
1:3
1:4

など。しかし実際には、コロン演算子のどちらかの側の引数はスカラーでなければなりません。それら自体をベクトルにすることはできません。Matlab があなたの 2 行のコードでエラーをスローしていないとあなたが言ったことに驚いています。

したがって、より興味深い質問は、これらのベクトルをどのよう作成しますか (について知らなかった場合、または使用したい場合cumsum)?

ここでは、 を使用できますarrayfun。要素ごとの入力として配列を使用して関数を評価します。これは、このような状況で役立ちます。だから私たちが書くなら

x = 1:10;
s = arrayfun(@(n)sum(A(1:n)), x);

これにより、 x のすべての値がループされ、それらが function に代入され、sum(A(1:n))出来上がり - 問題が解決されます。

しかし、本当に - 正解は「使用するcumsum()」です...

于 2013-10-17T02:39:06.743 に答える
0

実際にあなたがしていることは s(1:10)= sum(A(1:[1,2,3...10])) です あなたがすべきことは

for i=1:10
    s(i)=sum(A(1:i))
end

それがあなたを助けることを願っています

于 2013-10-17T02:48:48.683 に答える