以下是问题:编写一个MATLAB程序,使用diag命令生成n乘n的循环矩阵:给定向量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
有趣的是,由于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;
代码
%%// 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
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
在没有任何循环的情况下实现这一点的最简单方法是利用循环矩阵的傅立叶特性,并使用FFT:
V = ifft( fft( diag( fft(x) ), [], 1 ), [], 2 );