【问题标题】:Efficient dense diagonal matrix generation in matlab [duplicate]matlab中高效的密集对角矩阵生成[重复]
【发布时间】: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 感谢您在网站上提供有关适当礼仪的信息。我对提供的答案很满意。

标签: algorithm matlab matrix


【解决方案1】:

使用linked question中给出的方法:

a = [conj(data(end:-1:2)), data];
n = (numel(a)+1)/2;
A = a(bsxfun(@minus, n+1:n+n, (1:n).'));

【讨论】:

  • 这确实很快!干得好!
  • @Divakar:谢谢!有一个比你更好的bsxfun-解决方案并不容易,所以我不得不发布它。 ;-)
  • 当然更好地使用bsxfun! :)
【解决方案2】:

这可能会解决它 -

%// Length of input data
N = numel(data)

%// Conjugate of input data
cdata = conj(data) 

%// Circulating indices
idx = mod(bsxfun(@plus,[N:-1:1]',0:N-1),N)+1 %//'

%// Fill upper triangular part with given data and lower triangular with 
%// conjugate data. The first element of data going into the main diagonal.
out = triu(data(idx)) + tril(cdata(idx.'),-1) 

示例运行 -

data =
   0.1925 + 0.8901i
   0.8126 + 0.9481i
   0.1138 + 0.3276i
   0.0469 + 0.4714i

out =
   0.1925 + 0.8901i   0.8126 + 0.9481i   0.1138 + 0.3276i   0.0469 + 0.4714i
   0.8126 - 0.9481i   0.1925 + 0.8901i   0.8126 + 0.9481i   0.1138 + 0.3276i
   0.1138 - 0.3276i   0.8126 - 0.9481i   0.1925 + 0.8901i   0.8126 + 0.9481i
   0.0469 - 0.4714i   0.1138 - 0.3276i   0.8126 - 0.9481i   0.1925 + 0.8901i

【讨论】:

  • 太棒了!将时间从我的 170 秒缩短到 0.483173 秒。谢谢!
  • @egwenesedai 太棒了!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多