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