vector to upper and lower triangular matrix

조회 수: 29 (최근 30일)
Edwin Chamba
Edwin Chamba 2019년 11월 10일
댓글: Edwin Chamba 2019년 11월 10일
Hey, I'm new to Matlab and wanted to know how to input a 1 by n matrix and output a n by n matrix such that the diagonals are the mean of the 1 by n matrix and the upper and lower trianglars are elements of that 1 by n matrix. I have it working for the case n = 3 and here is my code:
A = [ 5 4 3];
a = [0 A(1) A(2);
A(1) 0 A(3);
A(2) A(3) 0];
A_ij = mean(A)*eye(length(A),length(A)) + a;impendence.PNG

채택된 답변

John D'Errico
John D'Errico 2019년 11월 10일
What you fail to see is that while your code works for a 3x3 matrrix, it must always fail for any n other than n==3.
You want to provide a vector of length n, and use it to populate the upper and lower triangles of the matrix, as you did for the 3x3.
What about n==2? That would suggest you would supply a vector of length 2. But there is only ONE element in the upper or lower triangle of a 2x2 matrix.
How about if n is other than 3? Note that in general, there are n*(n-1)/2 elements in the upper triangle of an nxn matrix. When n==3, we get exactly 3 elements in the triangles. But consider this little table:
[n;n.*(n-1)/2]
ans =
1 2 3 4 5
0 1 3 6 10
The first row is n. The second row is the number of elements in the strict upper triangle of an nxn matrix (as well as the strict lower triangle.)
The point being that you CANNOT supply a vector of length n and hope to get the result that you are asking for. It just won't work, ever, except for n==3. So for a 5x5 matrix, there are 10 elements in that upper triangle.
If you supply the correct number of elements, then yes, you can easily build a matrix. I'll give you one solution, perhaps with this:
n = 5;
V = 1:10;
ind = find(tril(ones(n,n),-1));
LT = zeros(n);
LT(ind) = V;
LT
LT =
0 0 0 0 0
1 0 0 0 0
2 5 0 0 0
3 6 8 0 0
4 7 9 10 0
MAT = LT + LT' + eye(n)*mean(V)
MAT =
5.5 1 2 3 4
1 5.5 5 6 7
2 5 5.5 8 9
3 6 8 5.5 10
4 7 9 10 5.5

추가 답변 (1개)

David Hill
David Hill 2019년 11월 10일
Not sure what elements you want above and below the diagonal.
a=repmat(A,[length(A),1]).*~diag(ones(1,length(A)))+mean(A)*eye(length(A));
  댓글 수: 1
Edwin Chamba
Edwin Chamba 2019년 11월 10일
Thank you for the code. I added a picture to try to better explain what I meant by the above and below parts of the diagonals.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Operating on Diagonal Matrices에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by