How to create a matrix with 1 on ij-th position and zeros elsewhere from a lower triangular matrix?

It may be a very simple question For a symmetric matrix A (3x3), say A=[2 4 6;4 8 11;6 11 20], the way to extract its unique elements (on and lower the diagonal) in an output vector B is:
B=(A(tril(A)~=0))
B = 2
4
6
8
11
20
How can I create matrices C1,C2,C3,...,C6, such that
B(1)=A.*C1, B(2)=A.*C2, ..., B(6)=A.*C6
C1=[1 0 0;0 0 0;0 0 0];
C2=[0 0 0;1 0 0;0 0 0];
C3=[0 0 0;0 0 0;1 0 0];
C4=[0 0 0;0 1 0;0 0 0];
C5=[0 0 0;0 0 0;0 1 0];
C6=[0 0 0;0 0 0;0 0 1];

4 Comments

I want to add another inquiry, In the above setting B=vech(A), on the relation B(f)=A(i,j), we have the following relation on the indices that f=(j-1)(k-j/2)+i, where k is the order of the matrix A (here k=3) if I know f and K can I know the corresponding i,j ??
I search and I guess this may work
IND=find(tril(A)~=0)'
[I,J] = ind2sub(size(A),IND)
Try this:
[I,J] = find(tril(A)~=0)
Note that you can already find this in my answer, on this line:
[R,C] = find(T);
Stephen, my last comment answer my last question I add, the relation compute the index (i,j) corresponds to f. which as you comment it coincide with a part of you answer as well.
Thanks a lot for your prompt reply
Best regards

Sign in to comment.

 Accepted Answer

A = [2,4,6;4,8,11;6,11,20]
S = size(A);
T = tril(true(S));
[R,C] = find(T);
N = nnz(T);
Z = zeros([S,N]);
V = 1:N;
Z(sub2ind([S,N],R,C,V(:))) = 1
Each page of Z (i.e. the third dimension) is one of the requested matrices, which you can access easily using indexing:
>> Z(:,:,1)
ans =
1 0 0
0 0 0
0 0 0
>> Z(:,:,2)
ans =
0 0 0
1 0 0
0 0 0
...
>> Z(:,:,6)
ans =
0 0 0
0 0 0
0 0 1

More Answers (0)

Categories

Find more on Mathematics in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!