1

我是一名信号处理领域的法国学生工程师,我在神经科学实验室实习。我必须在 Matlab 的帮助下处理来自大脑活动的大量数据,所以我的主要课题之一是优化代码。但是现在我陷入了无法解决的情况,并且在网上找不到任何关于它的信息。我解释我的问题:

例如矩阵 a :

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

每一行都是一个信号的数据(所以这里我们有 3 个信号),我想,对于每个信号/行,将向量切割成相同长度的互连块。

例如对于信号 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-loop。我正在寻找一种能够删除这些 for 循环的算法,但我不知道该怎么做......

我看到了“重塑”功能,但这给了我这样的子块:S1_1 = [1 2 3], S1_2 = [4 5 6]我不能使用它,因为在子块 S1_2 中,我有来自信号 1 和信号 2 的数据。

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

所以,我希望你能理解我的问题,并希望你能帮助我或告诉我找到解决方案的方法。

4

4 回答 4

0

Blockproc 似乎是在做块操作而不是滑动操作。一点点挖掘给出了这个:

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

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

这也可能有帮助:

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

一般来说,尝试搜索滑动窗口或卷积,并尝试查看是否出现了什么。

于 2013-06-03T15:11:03.333 回答
0

您可能会找到另一种使用该arrayfun函数进行循环的方法,但事实是它可能不一定更快arrayfun 可能比 matlab 中的显式循环慢得多。为什么?

于 2013-06-03T15:16:55.003 回答
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)数据行的所需k = 1:data_rows子块在哪里k( a)。

于 2013-06-03T15:23:08.750 回答
0

非常感谢您的所有(快速)回答!没想到这么快就得到了答复!

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

谢谢您的帮助

于 2013-06-05T07:49:07.860 回答