【问题标题】:Using `diag()` Command to Construct Circulant Matrix使用 `diag()` 命令构造循环矩阵
【发布时间】:2014-04-19 19:13:46
【问题描述】:

这是一个问题: 编写一个使用 diag 命令生成 n × n 循环矩阵的 MATLAB 程序:给定向量 v = (v1 v2 v3 ....vn)。循环矩阵示例:

A = [1 2 3 4 5;
     5 1 2 3 4;
     4 5 1 2 3;
     3 4 5 1 2;
     2 3 4 5 1]

注意连续行的环绕模式。
使用diag command in MATLAB

(这是我开始的,我在使用diag 命令构造矩阵时遇到了麻烦。请帮忙)。

n = length(v);
a = zeros(n);

for i = 1:n

【问题讨论】:

  • 我认为@Divakar 已经确定了diag 的方法,但是toeplitz 使它成为一个单线(toeplitz(circshift(flipud(v(:)),1),v)),虽然我不认为你会从你的教授为那个答案。 :D
  • @chappjc 是的,我们都必须通过“Prof-ways”!
  • 顺便说一句:这个矩阵是内置的:gallery('circul',1:5)chappjc 很接近,因为实现实际上使用了toeplitz
  • @knedlsepp, 只是为了提供完整的信息,实际的 doe 在函数circul()(输入edit circul.m)中。

标签: matlab matrix linear-algebra


【解决方案1】:

有趣的是,因为all the circulant matrices are made diagonal by the DFT,你也可以这样做

// given vector
v = [1 2 3 4 5];
n = numel(v);
// DFT matrix
F = dftmtx(n);
//circulant matrix
V = (F*diag(fft(v))*F')./n;

【讨论】:

    【解决方案2】:

    代码

    %%// Given vector v
    v = [1 2 3 4 5];
    
    %%// Parameters
    n = numel(v);
    arr1 = [v1(2:end) v1];
    
    %%// Construct circulant matrix
    A1 = zeros(n);
    for k = -(n-1):n-1
        A1 = A1+ arr1(k+n)*diag(ones(n-abs(k),1),k);
    end
    

    【讨论】:

      【解决方案3】:
      function m = prgrm9( x )
      %UNTITLED3 Summary of this function goes here
      %   Detailed explanation goes here
      
      m = diag(x(1)* ones(1,length(x)));
      
      for i = 2: length(x)
         m = m + diag(x(i) * ones(1, length(x)-(i-1)),i-1)+ diag(x(i)*ones(1,i-1),i-(length(x)+1));
      end
      

      【讨论】:

        【解决方案4】:

        不使用任何循环的最简单方法是利用循环矩阵的傅立叶属性并使用 FFT:

        V = ifft( fft( diag( fft(x) ), [], 1 ), [], 2 );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-02
          • 2017-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多