【问题标题】:how to find difference between two vectors as a function of time-lag in MATLAB如何在MATLAB中找到两个向量之间的差异作为时间滞后的函数
【发布时间】:2012-10-25 16:35:30
【问题描述】:

第一次在这里发帖!很乐意接受我能得到的任何建议||criticism。

我们有两个向量:v1v2。假设length(v1) >> length(v2)。我沿着向量v1 移动一个大小为length(v2) 的窗口。在每个滞后指数处,从v1 的窗口部分中减去v2。然后我对结果向量的项求和,并为向量v1 的长度上的每个滞后索引返回这个总和。为简单起见,让我们忽略边缘情况。

我已经用for 循环完成了这个,但是我的向量的长度大约是 10^9 [和更大],即使计算很简单,它似乎也需要很长时间只需遍历整个事情。

有什么想法吗?我怀疑有一个函数可以做这样的事情,但我没有找到它。

【问题讨论】:

  • 我对你到底在做什么有点困惑。你能提供一个简短的例子吗?如果您只是对所有元素求和,那么如何对齐向量并不重要;你只是在每一端留下不同数量的元素。
  • 感谢您指出这一点。我可以确切地看到为什么我的解释不是一个好的解释。我已经编辑了这个问题以更好地反映我的实际意思(我希望它现在更有意义)。
  • 你真的是在总结向量之间的差异,而不是差异的一些规范?
  • 这实际上正是我接下来要尝试的事情。认为首先考虑一个更简单的操作会很好,但看起来同样的技巧可能行不通......在这种情况下我是否坚持使用for 循环?
  • 我不知道有任何内置函数可以在这种情况下工作。您可能会查看 mex-functions,它是 matlab 的 c 扩展。对于像这样的简单操作,它们相当容易编写,并且比 for 循环具有更好的性能。

标签: performance matlab signal-processing time-series vectorization


【解决方案1】:

如果您允许我重新构建问题,您基本上想要一个向量的窗口总和。然后,您要从中减去某个其他向量的总和。

我的解决方案是在matlab(cumsum)中使用累积和函数,如下:

l1 = length(v1);
l2 = length(v2);
windowSum = cumsum( [v1 zeros(1,l2)] ) - cumsum( [zeros(1,l2) v1] );
returnVal = windowSum - sum(v2);

这假设 v1v2 是行向量。它用右边的零填充v1,获取累积和,然后减去左边填充的零的累积和。这会产生一个向量,使得windowSum(i)v1 前面索引ilength(v2) 元素的总和。根据您希望处理边缘的方式、您希望向量的长度等,这应该可以解决您的问题。

【讨论】:

  • 如果不清楚,第一步是交换运算顺序:加减运算。这是有效的,因为求和是线性的。
  • 这绝对是一个聪明的方法。艾萨克,你是一位绅士和一位学者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2021-12-22
  • 2015-03-22
  • 2021-06-27
相关资源
最近更新 更多