【问题标题】:Split a vector according to a defined sequence根据定义的序列拆分向量
【发布时间】:2013-03-24 22:57:08
【问题描述】:

任何人都可以提出一种可以根据预定顺序对向量执行操作的方法 - 例如,我有一个不同值的向量 M,其大小为 。我有另一个带有数字序列 P 的向量(大小 ),这个序列的总和为 8760。我想使用这些 P 值来索引向量 M 并找到每个索引的乘积。

一个更清楚的例子:

M = [1,2,4,2,3,4,5,3,4,2];

P = [2,2,4,2];

结果 = [3,6,15,6]

我们将不胜感激。

彼得.S.

【问题讨论】:

  • 我不明白你想做什么。要使用 P 作为 M 的索引,请使用 M(P)。在您的示例中,这将为您提供 [2, 2, 2, 2] 。产品来自哪里?
  • 抱歉,我错误地使用了术语索引。我想找到给出 M(1,1)+M(1,2) =3 的值的结果,然后是 M(1,3)+M(1,4) =6,然后是 M(1,5) +M(1,6)+M(1,7)+M(1,8)=15 和 M(1,9)+ M(1,10) =6。
  • 以下代码可以用来解决这个问题:M = [1,2,4,2,3,4,5,3,4,2]; P = [2,2,4,2]; id2=累积和(P); id1=[1 id2(1:end-1)+1];对于 k=1:numel(id1) 结果(k)=sum(M(id1(k):id2(k)));结束 % 或 id2=cumsum(P); id1=[1 id2(1:end-1)+1];结果=arrayfun(@(x,y) sum(M(x:y)),id1,id2)
  • 您应该将其添加为答案并接受它,以便可以关闭问题。

标签: matlab vector indexing sequence


【解决方案1】:

这是一种基于acummarray 的方法和一种使用cumsum 制作索引向量的巧妙方法。给定两个向量:

M = [1,2,4,2,3,4,5,3,4,2];
P = [2,2,4,2];

P 中为每个频率值创建一个唯一索引向量(在此SO 帖子之后):

numM = sum(P);
index = zeros(numM, 1);
index(cumsum([1 P(1:end-1)])) = 1;
index = cumsum(index);

>> index'
ans =
     1     1     2     2     3     3     3     3     4     4

使用构造的索引向量和值向量应用accumarray()

result = accumarray(index, M);

>> result'
ans =
     3     6    15     6

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2021-10-03
    相关资源
    最近更新 更多