你能对这个问题发表意见吗?我需要在Matlab中创建一个矩阵,如下所述:
对于给定的N
和三个值a
、b
和c
。我想创建一个(N-4(x(N-2(矩阵,例如N=8
a b c 0 0 0
0 a b c 0 0
0 0 a b c 0
0 0 0 a b c
非常感谢
您试图创建的是toeplitz矩阵。一个你知道的名字,很简单。
%construct the first row
row=zeros(N-2,1);
row(1:3)=[a,b,c];
%construct the first column
col=zeros(N-4,1);
col(1)=a;
%call the function
toeplitz(col,row)
a=4;b=2;c=3;N=8;
结果
ans =
4 2 3 0 0 0
0 4 2 3 0 0
0 0 4 2 3 0
0 0 0 4 2 3
您可以使用单位矩阵函数eye()
和一些矩阵级联来求解:
N = 8;
a = 1;
b = 2;
c = 3;
a_I = [zeros(N-4, 0), a*eye(N-4), zeros(N-4, 2)];
b_I = [zeros(N-4, 1), b*eye(N-4), zeros(N-4, 1)];
c_I = [zeros(N-4, 2), c*eye(N-4), zeros(N-4, 0)];
X = a_I + b_I + c_I
产生输出的
X =
1 2 3 0 0 0
0 1 2 3 0 0
0 0 1 2 3 0
0 0 0 1 2 3
您也可以使它稍微更通用,并让标量a
、b
和c
包含在一个向量中:
N = 8;
v = [1 2 3];
X = zeros(N-4, N-2);
for ii = 1:length(v)
X = X + [zeros(N-4, ii-1), v(ii)*eye(N-4), zeros(N-4, length(v)-ii)];
end
产生相同的输出。
尝试这个完全矢量化的函数:
function b=bandmat(a, N, M)
% license: CC-BY
% example: bandmat([1,2,3],4,6)
b=a(:).';
b(M+1)=0;
b=repmat(b,1,N);
b=reshape(b(1:end-N),M,N).';