Message Boards Message Boards

0
|
21150 Views
|
2 Replies
|
1 Total Likes
View groups...
Share
Share this post:

How can I mirror the values of a matrix about its diagonal?

Posted 11 years ago
So I am generating large matrices (the smallest is 48x48) but only one half of the matrix is viable. Unltimately, what I need is a matrix that is symmetric about the diagonal. At the moment, I am just copying and pasting the values that I need, which is highly impractical as the size of the matrix scales up. The function I am using to generate the values is based off of the difference between the row and column, and so it generates different results when this value is negative verses positive. It also doesnt help to just wrap the difference in an Abs[], for whatever reason (I will post the code at the bottom just in case their is a way to get symmetry without messing with the matrices). I havent really been able to think of a way to do this, but what I would like to be able to do is just redefine all of the values on one half of the diagonal using the "correct" values on the other side of the diagonal. In this particular instance, the "correct" values are those in which m>n in the m x n matrix. 
pA[ j_, v_] := -I*(-1)^j*(2*DeA*MA)^(1/2)*K[ j, v ]

K[ j_, v_ ] := ((Gamma[ k - v - j ]*Factorial[ v + j ]*(k - 2*v - 2*j - 1)*(k - 2*v - 1))/(Gamma[ k - v ]*Factorial[ v ]))^(1/2)*(1/ k)

k := (4*DeA)/(\[HBar]*\[Omega]eA)

All of those values are then used to generate the matrix, which I have called matpA:
matpA := Table[pA[((m - 1) - (n - 1)), (n - 1)], {m, vmaxA}, {n, vmaxA}]

Thanks so much for taking the time to read this and for any help you can provide!
POSTED BY: Cole Rodman
2 Replies
I used the following approach on large sparse matrix (10000 x 10000):
A =  T + Transpose[T]-Diagonal[T]
I Suppose your initial matrix is called T , the diagonal is Ok as well as the lower triangular (or the upper, does not matter), I assume you you built it limiting the calculated terms T[[m,n]] such as m<=n, the rest being initialized at zero.The resulting matrix is called A (can be T as well).
Best regards

Christian
POSTED BY: Christian Neel
Posted 11 years ago
If tri was a lower triangular n x n matrix, how about:
Array[If[#1 > #2, tri[[#1, #2]], tri[[#2, #1]]] &, {n, n}]
You are still copying, but maybe with less code.

If this looked cryptic, then you'd probably like to check these documentation pages:

http://reference.wolfram.com/wolfram-language/ref/Array.html
http://reference.wolfram.com/mathematica/tutorial/PureFunctions.html
POSTED BY: Peter Fleck
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract