【问题标题】:Extract fixed amounts of data from array based on a list of indices根据索引列表从数组中提取固定数量的数据
【发布时间】:2012-11-13 13:03:50
【问题描述】:

我有数组

a=1:20

以及一系列指示我想从哪里开始提取数据的索引:

i=[4,12]

对于每个索引i,我希望该索引和接下来的四个(嗯,x,真的)元素在列或行中。我会避免接近数组的末尾,因此可以忽略特殊情况。

如果我对此进行硬编码,我可以使用:

a([4:8;12:16])

这将达到我的结果。

i 可能有许多不同的值。

关于如何将索引列表转换为范围矩阵或解决此问题的其他方法有什么想法吗?

编辑 我正在使用 Matlab 2007;如果解决方案仅依赖于 Matlab 的内部结构和工具箱​​,那将是更好的选择。 bsxfun 直到 2007 年才出现。

【问题讨论】:

  • 如果范围重叠怎么办?您想获得相同的元素两次还是一次?
  • @Jonas,范围应该被认为是独立的。如果它们重叠,它们会返回相同的数据,就好像它们没有重叠一样。

标签: matlab bsxfun


【解决方案1】:

i成为你的索引x,x是你想要的元素数量,除了i中的元素,那么你可以使用

i = [4 6 8];
x = 4; 

bsxfun(@plus, 0:x, i(:)) 

获取索引矩阵:

ans =

     4     5     6     7     8
     6     7     8     9    10
     8     9    10    11    12

如果您无权访问bsxfun,则可以改用repmat

i = [4 6 8];
x = 4; 

repmat(i(:), 1, x+1) + repmat(0:x, length(i), 1)

【讨论】:

  • 抱歉,我的 Matlab (2007) 版本似乎没有 bsxfun
  • 我想我的回复太晚了
  • 哇,repmat 的解决方案太狡猾了!谢谢,@H.Muster。
【解决方案2】:

这是一个没有 bsxfun 但受先前答案启发的 repmat 的解决方案。

i = [4 6 8];
x = 4;
p = repmat(1:x,length(i),1);
q = repmat(i',1,x);
p+q

【讨论】:

  • 但点赞还为时不晚! :-) 公平地说,我们必须说 H.Muster 的答案还有一种辅助方法,如果我不使用“石器时代的 Matlab”,这将是更可取的。
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2022-10-14
相关资源
最近更新 更多