我有一个创建随机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)
等等。
我尝试了命令diag
和tridiag
,但两者都只适用于整数。
修改
我将用一个例子来解释我的问题:
我创建了不同的随机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
答案 0 :(得分:2)
您必须找出trill
和triu
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)
您似乎希望将subdiagonal和superdiagonal元素与对角元素保持在一起。
方法#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))