-1

x = 500 X 612 行列に整数のデータがあります。500 X 612 マトリックスに新しい変数 xx が必要ですが、12 列のステップにわたって各行 (500) に沿って cumsum を適用し、このように cumsum を 51 回適用する必要があります --> 500 X (12 X 51) マトリックス。次に、cumsum 時系列の 500 行 12 列の 51 個のプロットを生成する for ループが必要です。ありがとう!

4

1 に答える 1

2

読んでいる人に利益をもたらすために、質問が求めていることを言い換えます。


OPは、マトリックスを一連の列に分割することにより、マトリックスをチャンクに分割したいと考えています。Acumsumは各列の各行に個別に適用され、連結されて最終的な行列が作成されます。そのため、次のソース マトリックスが与えられます。

x =

     1     2     3     4     5     6     7     8     9    10    11    12
    13    14    15    16    17    18    19    20    21    22    23    24

行列を列 3、6、9、12 で分割すると仮定すると、処理するチャンクは 4 つになります。cumsumこれらの各ブロックを個別に実行し、最終結果をつなぎ合わせます。したがって、結果は次のようになります。

xx =

     1     3     6     4     9    15     7    15    24    10    21    33
    13    27    42    16    33    51    19    39    60    22    45    69

まず、行列を分割する列の数を決定する必要があります。あなたの場合、行列を 4 つのチャンクに分割したいと考えています: 列 1 - 3、列 4 - 6、列 7 - 9、および列 10 - 12。そのreshapeため、各列がこの行列のチャンクからの個々の行。次に、この再形成されたマトリックスに適用cumsumし、元の形状に戻します。

したがって、次のようにします。

num_chunks = 4; %// Columns 3, 6, 9, 12
divide_point = size(x,2) / num_chunks; %// Determine how many elements are in a row for a cumsum
x_reshape = reshape(x.', divide_point, []); %// Get reshaped matrix
xy = cumsum(x_reshape); %// cumsum over all columns individually
xx = reshape(xy, size(x,2), size(x,1)).'; %// Reconstruct matrix

コードの 3 行目x_reshape = reshape(x.', divide_point, []);は少し難しいように見えるかもしれませんが、実際にはそれほど悪くはありません。チャンクの各行を取得して個々の列に配置し、各列で a を実行できるようにするため、最初に行列を転置する必要がありましたcumsum。MATLAB で何かを変形すると、値が列ごとに収集され、入力が指定されたサイズの出力に変形されます。したがって、行を収集するには、行ごとに収集する必要があるため、この行列を転置する必要があります。次に、divide_point1 つのチャンク内の 1 つの行に含まれる要素の数を示します。そのため、チャンクの行にいくつの要素があるかを示すサイズの行列を作成しdivide_point x Ndivide_pointNすべてのチャンクの合計行数です。いくつあるのかを計算したくないので (実際にはかなり怠け者です....)、[]構文はこの数を自動的に推測して、元の入力の要素の総数を尊重する再形成された行列を取得できるようにすることです。 . cumsum次に、これらの各列に対して実行しreshape、入力の元の形状に戻す必要があります。これによりreshape、結果に対して再度使用しcumsumますが、必要な行順序に戻すには、列優先順でreshape値を取るように転置を決定し、その結果を再転置する必要があります。

我々が得る:

xx =

     1     3     6     4     9    15     7    15    24    10    21    33
    13    27    42    16    33    51    19    39    60    22    45    69

一般に、行を合計する要素の総数は、マトリックスに含まれる列の総数で割り切れる必要があります。たとえば、上記の場合、この行列を 5 つのチャンクに分割しようとすると、cumsum超過する行数が対称的ではないため、エラーが発生することは間違いありません。

別の例として、マトリックスを 6 つのチャンクに分割したいとします。したがって、 を設定するnum_chunks = 6と、次のようになります。

xx =

     1     3     3     7     5    11     7    15     9    19    11    23
    13    27    15    31    17    35    19    39    21    43    23    47

cumsum6 つのチャンクが必要であり、12 列のマトリックスで 6 つのチャンクを取得するために、2 列ごとにチャンクが作成されるため、2 列ごとに再開されることがわかります。

于 2015-03-06T19:08:06.900 に答える