【问题标题】:Vectorization of removal of non-periodic offset from data, where offset values are stored in same vector as data从数据中去除非周期性偏移的矢量化,其中偏移值存储在与数据相同的矢量中
【发布时间】:2016-11-15 11:47:43
【问题描述】:

我有两个行数相等的列矩阵:

其中一个列矩阵(我们称之为T)是一组按升序排序的唯一整数的非周期性集合。 T 可以通过以下方式模拟:

T=sort(randperm(10E6,100)) ;
T=T';

另一列矩阵(我们称其为C)为0或1,表示后续操作中T中对应行的状态。 0 比 1 更不可能发生。C 可以通过以下方式模拟:

C=ones(100,1);
C(randperm(100,10))=0;

实际上,这些列矩阵将包含数百万个元素,并且此处的示例有意缩短以提高测试速度。

我们遍历C 的每一行。如果C 中的一个元素的值为0,那么T 中的相应行值将从每个T 行中的所有后续值中减去,直到我们在C 中达到另一个0。

我现在正在尝试对以下操作进行矢量化,以提高对数百万个元素矩阵进行操作时的速度。

lastReset = 0;
newT = NaN*zeros(length(T),1);
for index = 1:length(C)
    if C(index) == 0
        lastReset = T(index);
    else
        newT(index) = T(index) - lastReset;
    end
end
newT(C==0)=[];

如何矢量化上述for 循环?

【问题讨论】:

  • 你有什么问题?
  • 亲爱的 saygins,很抱歉我没有提出问题。现在我已经编辑了指定我的请求的帖子。谢谢。

标签: matlab signal-processing vectorization


【解决方案1】:

通常,像这样的“运行”操作的关键命令是用cumsum的输出索引一个数组:

inds = (C == 0);
subT = [0; T(inds)];    
newT = T - subT(cumsum(inds)+1);
newT(inds) = [];

但是,至少在 R2010a(是的,旧版本)上,它实际上比大型 N 的循环,而对于较小的 N,它只稍微快一点。

不过,这很难理解。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2016-10-06
    相关资源
    最近更新 更多