【问题标题】:MATLAB APPLY CUMSUM IN STEPSMATLAB 分步应用 CUMSUM
【发布时间】:2015-03-06 17:47:44
【问题描述】:

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

【问题讨论】:

  • 你能提供一个你尝试过的例子吗?另外,请缩小您的问题范围;就目前而言,您要求我们为您编写所有代码以完成一些不同的任务。
  • 举一个小的数值例子。您是说要将矩阵分割成 51 个大小为 12 的块,并且要将cumsum 分别应用于每个块?
  • 示例...x = [1:12; 13:24]。假设我需要为新变量 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].. 然后我不知道如何使用 for 循环或类似的方法为每行 3 列的每个 cumsum 列步骤制作一个简单的 xx 图。所以,我需要 4 个 xx(1,:) 的图和 4 个 xx(2,:) 的图。摘要 - 我需要按步骤在列中应用 cumsum 以及跨列的 cumsum 时间序列的简单线图。希望这会有所帮助。
  • @user2100039 - 是的。那正是我所想。您想将矩阵分解为多列并将cumsum 应用于每个块。我会写一个答案。
  • @user2100039 - 我已经写了一个答案。请检查最近的编辑,因为我必须更正几行代码。祝你好运!

标签: matlab cumsum


【解决方案1】:

我将重新表述问题所要求的内容,以使正在阅读的人受益。


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 中重塑某些东西时,它会收集 column-wise 值并将输入重塑为指定大小的输出。因此,为了收集行,我们需要收集row-wise,所以我们必须转置这个矩阵。接下来,divide_point 告诉您我们在一个块中的单行有多少个元素。因此,我们要构造一个大小为divide_point x N 的矩阵,其中divide_point 告诉您我们在一个块的一行中有多少个元素,N 是所有块的总行数。因为我不想计算有多少(实际上我相当懒惰......),[] 语法是自动推断这个数字,以便我们可以得到一个尊重元素总数的重构矩阵原始输入。然后我们对这些列中的每一列执行cumsum,然后我们需要将reshape 恢复为输入的原始形状。有了这个,我们在cumsum 结果上再次使用reshape,但是为了让它回到你想要的行顺序,我们必须确定转置,因为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 列矩阵,每隔一列创建一个块。

【讨论】:

  • 谢谢。 “获取重构矩阵”中的右括号 [] 是什么意思?
  • [] 的意思是自动推断给定行数的总列数。例如,如果我们有一个1 x 24 向量,则执行reshape(x, 8, []) 将意味着我们有 8 行,并且 MATLAB 会自动计算出多少列数来尊重整形。在这种情况下,我们会得到一个8 x 3 矩阵。
  • @user2100039 - 我已经添加了一些关于代码正在做什么以获得所需结果的更多解释。
  • 知道了。一直在努力提高我的 MATLAB 技能,但进展缓慢。再次感谢 - 你可以考虑教授这个主题。
  • 没问题!我也花了一段时间才学会这个:)有趣的故事。我曾经在我上学的地方教书,每年我都会举办 MATLAB 研讨会。我当然想念教学!如果您还有任何问题,我在这里。祝你好运!
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2018-08-08
相关资源
最近更新 更多