MATLAB在步骤中应用CUMSUM

时间:2015-03-06 17:47:45

标签: matlab cumsum

我有x = 500 X 612矩阵的整数数据。我需要在500 X 612矩阵中使用新的变量xx,但我需要沿着每个行(500)在12个列步骤中应用cumsum并应用这样的cumum 51次 - > 500 X(12 X 51)矩阵。然后我需要一个for循环来生成500行和12列cumsum时间序列的51个图。谢谢!

1 个答案:

答案 0 :(得分:2)

我将重新讲述问题是为了让正在阅读的人受益。


OP希望通过将矩阵分成一堆列来将矩阵分割成块。对于每列,每个行分别应用cumsum,然后将它们连接在一起以构建最终矩阵。因此,给定此源矩阵:

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拆分矩阵,我们将有四个块可供使用。我们分别对每个块进行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

在第三行代码中,x_reshape = reshape(x.', divide_point, []);可能看起来有点令人生畏,但实际上并没有那么糟糕。我必须首先转置矩阵,因为你想要获取一个块的每一行并将它们放入单独的列中,这样我们就可以在每列上执行cumsum。当您在MATLAB中重塑某些内容时,它会收集值按列并将输入重新整形为指定大小的输出。因此,要收集行,我们需要收集行式,因此我们必须转置此矩阵。接下来,divide_point告诉您我们在一个块中为单个行提供了多少元素。因此,我们希望构造一个大小为divide_point x N的矩阵,其中divide_point告诉您我们在一行块中有多少个元素,N是总行数所有的块。因为我不想计算有多少(实际上是懒惰......),[]语法是自动推断这个数字,这样我们就可以获得一个重新定义的矩阵,该矩阵尊重总数。原始输入中的元素。然后,我们在每个列上执行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

你可以看到cumsum每隔一列重新开始,因为我们需要6个块,并且得到6个具有12列矩阵的块,每隔一列创建一个块。