【发布时间】:2015-03-18 14:30:28
【问题描述】:
给定一个复数数组data,我需要构造一个形式为
使用 matlab 或 python,其中 * 表示复共轭。现在我使用diag(data(k)*ones(1,n-k),k) 来获得第k 个对角线,然后将其放入一个循环中,该循环遍历k,同时对负k 进行共轭,然后求和。然而,这是在另一个循环中,分析表明这个过程需要很长时间。矩阵不是稀疏的并且相当大(~2000x2000)。还有另一种方法可以有效地实现这一目标吗?它与this question 有点相关,也许我可以在那个问题中将a 定义为a = [ data(n)^*, data(n-1)^*, ..., data(0), data(1), ...],但非常感谢更简洁的方法。另外,我的案例比链接的问题更对称,所以也许有更好的解决方案。
我的代码的 MWE,耗时约 170 秒。在我的电脑上运行:
tn=2000;
ats=randn(1,tn)+1j*randn(1,tn);
cm=0;
for jx=-tn+1:tn-1
if jx>=0
cm=cm+diag(ats(jx+1)*ones(1,tn-abs(jx)),jx);
else
cm=cm+diag(conj(ats(-jx+1))*ones(1,tn-abs(jx)),jx);
end
end
【问题讨论】:
-
分享你的循环代码?
-
这可能会解决您的问题:stackoverflow.com/questions/29028566/…
-
应该够用了:
a = [flip(conj(data(2:end))), data]然后是另一个问题的答案。 -
当您不断向您的问题添加信息时:一旦您通过单击复选标记接受答案,即表示问题已解决。如果您对答案还不是 100% 满意,可以等待一段时间,直到您认为不会有更好的答案出现。或许可以浏览一下this question and answer,这样你就知道何时以及接受什么。
-
@knedlsepp 感谢您在网站上提供有关适当礼仪的信息。我对提供的答案很满意。