在Matlab中用其他矩阵创建一个三对角矩阵

时间:2014-11-05 10:26:57

标签: matlab matrix diagonal

我有一个创建随机nxn - 矩阵A(i,j)的算法,现在我希望这个矩阵呈三角形:

A(1,1) A(1,2)  0       0      0
A(2,1) A(2,2) A(2,3)   0      0
  0    A(3,2) A(3,3) A(3,4)   0
  0      0    A(4,3) A(4,4) A(4,5)

等等。

我尝试了命令diagtridiag,但两者都只适用于整数。

修改 我将用一个例子来解释我的问题: 我创建了不同的随机3x3矩阵:

a=randi(10,3);
b=randi(10,3);
...
k=randi(10,3)

现在我想创建一个大的三对角矩阵L,其中随机矩阵a,...,k位于子线,超线和对角线上:

L= a b 0 0 0
   c d e 0 0
   0 f g h 0
   0 0 i j k

2 个答案:

答案 0 :(得分:2)

您必须找出trilltriu

的组合
 a = randi(9,4,5);
 a .* triu(ones(4,5),-1).*tril(ones(4,5),1)

 >>ans =

 4     6     0     0     0
 9     1     7     0     0
 0     8     7     7     0
 0     0     4     1     8

对于浮动数据,它也会这样做,

 a = rand(4,5);
 a .* triu(ones(4,5),-1).*tril(ones(4,5),1)

>>ans =

0.6948    0.4387         0         0         0
0.3171    0.3816    0.4898         0         0
     0    0.7655    0.4456    0.2760         0
     0         0    0.6463    0.6797    0.4984

更有效率(感谢@Divakar),

a.*(triu(ones(4,5),-1) & tril(ones(4,5),1));

甚至更简单(感谢@LuisMendo),

tril(triu(a,-1),1);

答案 1 :(得分:0)

您似乎希望将subdiagonalsuperdiagonal元素与对角元素保持在一起。

方法#1

对于通用的m×n大小的矩阵,第一种方法可以是bsxfun -

[m,n] = size(A); %// get size
Aout = A.*( bsxfun(@le,[0:m-1]',1:n) & bsxfun(@ge,[1:m]',0:n-1))

示例运行 -

A =
     1     2     2     2     6
     6     4     8     4     3
     8     5     6     5     4
     7     9     4     2     6
Aout =
     1     2     0     0     0
     6     4     8     0     0
     0     5     6     5     0
     0     0     4     2     6

方法#2

如果您正在使用从here获得的tridiag,那么您可以为n x n大小的矩阵完成以下操作 -

Aout = A.*tridiag(1,1,1,n)

修改

参考问题的编辑部分,此代码应该有效 -

%// Create regularly shaped all matrices holding variable. 
%// This regularity would be used for cutting into a 3D array in the next step
A = cat(1,NaN(3),a,c,b,d,f,e,g,i,h,j,NaN(3),k,NaN(3),NaN(3));

%// Cut A after every 9 rows
N = 9;
Acut = permute(reshape(A,N,size(A,1)/N,[]),[1 3 2])

%// Create mask that will act as the building unit for L
m = 4;n = 5; 
mask = bsxfun(@le,[0:m-1]',1:n) & bsxfun(@ge,[1:m]',0:n-1)

%// Setup L with ones at places where elements from matrices are top be put
sf = 3; %// scaling factor
L = double(mask(ceil(1/sf:1/sf:size(mask,1)), ceil(1/sf:1/sf:size(mask,2))))

%// Finally, place the elements from matrices into their respective places
L(L==1) = Acut(~isnan(Acut))