切断信号(相互关联)并计算这些部分

时间:2013-06-03 15:00:25

标签: algorithm matlab optimization signal-processing nested-loops

我是信号处理领域的法国学生工程师,我在神经科学实验室实习。我将在Matlab的帮助下处理大脑活动中的大量数据,因此我的主要任务之一是优化代码。但现在我陷入了无法解决的境地,我在网上找不到任何相关信息。我解释了我的问题:

例如矩阵a:

a = [ 1 2 3 4 5;  6 7 8 9 10;11 12 13 14 15]

每一行都是一个信号的数据(所以这里我们有3个信号),我希望,对于每个信号/行,切换相同长度相互关联的blcok中的向量。

例如对于信号1,S1 = [1 2 3 4 5]我想提取块S1_1 = [1 2 3], S1_2 = [2 3 4], and S1_3 = [3 4 5]并计算每个子块。

我的第一个想法是使用这样的嵌套循环:

[nrow ncol] = size(a);

for i = 1 : nrow
   for j = 4 : ncol
      sub_block = a(i, (j-3):j);
      result(i, j-3) = compute(sub_block);
   end
end

但正如我所说,我必须处理大量数据,所以我想避免for循环。我正在寻找能够移除这些for-loop的算法,但我不知道该怎么办......

我看到了'reshape'这个函数,但是这个给了我子块像:S1_1 = [1 2 3], S1_2 = [4 5 6]我不能使用它,因为在子块S1_2这里有来自信号1和信号的数据2。

然后我看到了'blockproc'这个函数,但是我并不是真的理解它是如何处理的,我真的不相信这个可以帮助我......

所以,我希望你理解我的问题,你可以帮助我或指明我找到解决方案的方法。

4 个答案:

答案 0 :(得分:0)

Blockproc似乎正在执行块操作而不是滑动操作。稍微挖掘一下就可以了:

http://www.mathworks.com/help/images/ref/nlfilter.html

但似乎需要图像处理工具箱。

这也可能会有所帮助:

http://dovgalecs.com/blog/matlab-sliding-window-easy-and-painless/

一般情况下,尝试搜索滑动窗口或卷积,并尝试查看是否出现了某些内容。

答案 1 :(得分:0)

你可能会找到另一种使用arrayfun函数进行循环的方法,但事实是它可能不一定更快arrayfun can be significantly slower than an explicit loop in matlab. Why?

答案 2 :(得分:0)

除了@Ziyao Wei的建议,您还可以使用im2col

>> S = im2col(a', [3 1])
S =

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

S(:, 3*k-2:3*k)的{​​{1}}是数据行k = 1:data_rows所需的子块(k)。

答案 3 :(得分:0)

非常感谢你所有的(快速)答案!我没想到会这么快得到答案!

我有图像处理工具箱,你的不同方法很棒!我将不得不使用im2col因为对我来说是“较慢”的解决方案,我可以删除一个for循环。

感谢您的帮助