我是信号处理领域的法国学生工程师,我在神经科学实验室实习。我将在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'这个函数,但是我并不是真的理解它是如何处理的,我真的不相信这个可以帮助我......
所以,我希望你理解我的问题,你可以帮助我或指明我找到解决方案的方法。
答案 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循环。
感谢您的帮助