我试图用MATLAB中的一个for循环实现BlockLMS。为此,给定向量u,我试图创建一个形式为的表
U = [u(k) u(k+1) u(k+2) ... u(k+n)
u(k-1) u(k) ... ... u(k+n-1)
... ... ... ... ...
u(k-n) u(k-n+1) ... ... u(k)]
其中,n是常数,k是随时间变化的变量,始终保持不变k > n
。到目前为止,我已经完成的工作是:
index = meshgrid(0:-1:1-n)' + meshgrid(1:n);
for i = 2:q
% calculate k
U = u(k + index);
% rest of code goes here
end
尽管有效,但可惜速度非常慢,不符合我的需求。有没有更有效的方法来达到这个结果?
该操作有很多重复。因此,要充分利用这种性质,以下是一种使用方法repmat
以及bsxfun's
掩蔽功能的帮助:
mask = bsxfun(@ge,(1:2*n+1)',n+1:-1:1) & bsxfun(@ge,(2*n+1:-1:1)',1:n+1)
sliced_u = u(k+n:-1:k-n)
repvals = repmat(sliced_u(:),1,n+1)
out = reshape(repvals(mask),n+1,[])
一种描述这种方法的方式是,当输入的柱状版本u
沿列复制时,当我们向右移动时,将所需输出的列向上移一个位置。剩下的工作是抵消沿列移动的一个位置,这是通过bsxfun
的遮罩完成的,以截断上下三角形区域,以提供最终输出。
性能:这个想法以前曾被用于类似的问题this solution
,我希望这里有类似的性能数字。
作为另一种方法和直截了当的思路,人们可以使用它bsxfun
来获取2D索引,然后将其索引u
为最终输出,就像这样-
out = u(bsxfun(@plus,(k:-1:k-n)',0:n))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句