有没有办法快速从矢量中提取零件而不循环?

时间:2015-08-03 15:52:52

标签: arrays matlab vectorization

考虑到我有一个矢量/数组,它看起来如下:

enter image description here

每个部分是一些固定且已知大小的子数组(只能通过索引访问,即它不是张量或高阶数组)。例如:

x1 = x(1:d);

如果d是每个子数组的大小。每个子阵列的大小是相同的,但它可能会根据我们正在考虑的当前x而变化。但是,我们知道n(子数组的数量)和d(所有子数组的大小)。

我知道在matlab中通常会有一些奇怪但有用的技巧来做更优化的事情。有没有办法提取那些使用可能索引,并制作一个矩阵,其中行(或列)是那些部分?如:

X = [x_1, ..., x_n]
需要注意的是,n是一个变量,我们不知道它是什么。我们可以找到n是什么,但它没有固定。

我想最大限度地减少我在matlab中实际编写的for循环的数量,希望它更快......只是为了添加更多的上下文。

1 个答案:

答案 0 :(得分:1)

首先,我会考虑简单reshaping将输出保持为简单的双矩阵

x = (1:15).' %'
d = 3;

out = reshape(x,d,[])

进一步使用索引来访问列out(:,idx);

没有必要提前知道 n ,因为reshape正在根据dx中的元素数量计算它}。

out =

     1     4     7    10    13
     2     5     8    11    14
     3     6     9    12    15

如果您坚持使用单元格数组之类的内容,请使用accumarrayceil来获取子代数:

out = accumarray( ceil( (1:numel(x))/d ).', x(:), [], @(x) {x})

enter image description here