我是信号处理领域的一名法国学生工程师,我在一家神经科学实验室实习。我必须在Matlab的帮助下处理大量来自大脑活动的数据,所以我的主要课题之一就是优化代码。但现在我陷入了一个无法解决的境地,我在网上找不到任何关于它的东西。我解释一下我的问题:
例如矩阵a:
a = [ 1 2 3 4 5; 6 7 8 9 10;11 12 13 14 15]每一行都是一个信号的数据(所以这里我们有3个信号),我想,对于每个信号/行,在相同长度的块中切割向量。
例如,对于信号1,我想提取块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循环,但我不知道如何做…
我看到了函数‘重塑’,但这给了我一个子块,比如:S1_1 = [1 2 3], S1_2 = [4 5 6],我不能使用它,因为在子块S1_2中,我有来自信号1和信号2的数据。
然后我看到了'blockproc‘函数,但我并不真正理解它是如何处理的,我也不太确信这个函数能帮到我……
所以,我希望你能理解我的问题,并希望你能帮助我或告诉我一种找到解决方案的方法。
发布于 2013-06-03 23:23:09
除了@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其中,k = 1:data_rows的S(:, 3*k-2:3*k)是数据的行k (a)的所需子块。
发布于 2013-06-03 23:11:03
Blockproc似乎正在进行块操作,而不是滑动操作。稍微深入研究一下,就会得出以下结论:
http://www.mathworks.com/help/images/ref/nlfilter.html
但似乎需要图像处理工具箱。
这也可能会有所帮助:
http://dovgalecs.com/blog/matlab-sliding-window-easy-and-painless/
通常,尝试搜索滑动窗口或卷积,并尝试查看是否显示了某些内容。
发布于 2013-06-03 23:16:55
您可能会找到使用arrayfun函数执行循环的另一种方法,但事实是它可能不一定比arrayfun can be significantly slower than an explicit loop in matlab. Why?更快
https://stackoverflow.com/questions/16899782
复制相似问题