在MATLAB中重塑向量

编码爱好者

我试图用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章