* Keep a copy of my symmetric array indexer worksheet in GIT.
Original signature:
-rw-r--r-- 1 wirawan0 wirawan0 1380 2010-04-27 15:55 symmetrix-array-index.py
b873ece4610483b3cd5290c6ddbc7426 symmetrix-array-index.py
This commit is contained in:
73
math/symmetrix-array-index.PY
Normal file
73
math/symmetrix-array-index.PY
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# 20100427
|
||||||
|
|
||||||
|
"""
|
||||||
|
Symmetric array layout (lower diagonal, Fortran column-major ordering):
|
||||||
|
|
||||||
|
|
||||||
|
----> j
|
||||||
|
| (1,1)
|
||||||
|
i | (2,1) (2,2)
|
||||||
|
v (3,1) (3,2) (3,3)
|
||||||
|
: : :
|
||||||
|
(N,1) (N,2) (N,3) ... (N,N)
|
||||||
|
|
||||||
|
In linear form:
|
||||||
|
|
||||||
|
1
|
||||||
|
2 N+1
|
||||||
|
3 N+2 2N
|
||||||
|
: : :
|
||||||
|
N N+N-1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
iskip = i - j + 1 (easy)
|
||||||
|
|
||||||
|
jskip determination
|
||||||
|
i jskip jskip
|
||||||
|
(cumulant) (total)
|
||||||
|
1 0
|
||||||
|
2 N
|
||||||
|
3 N-1
|
||||||
|
4 N-2
|
||||||
|
...
|
||||||
|
j N-(j-2) (j-1)N - (j-2)(j-1)/2
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
Note:
|
||||||
|
|
||||||
|
{m}
|
||||||
|
SUM a = 1 + 2 + ... + m = m(m+1)/2
|
||||||
|
{a=1}
|
||||||
|
"""
|
||||||
|
|
||||||
|
import numpy
|
||||||
|
|
||||||
|
def test_jskip_1(N, M):
|
||||||
|
jskip1 = 0
|
||||||
|
jskip2 = 0
|
||||||
|
for m in xrange(1, M+1):
|
||||||
|
if m == 1:
|
||||||
|
cum = 0
|
||||||
|
else:
|
||||||
|
cum = N - (m-2)
|
||||||
|
jskip2 = (m-1)*N - (m-2)*(m-1)/2
|
||||||
|
jskip1 += cum
|
||||||
|
print "%5d %5d %5d %5d" % (m, cum, jskip1, jskip2)
|
||||||
|
|
||||||
|
|
||||||
|
def copy_over_array(N, arr_L):
|
||||||
|
rslt = numpy.zeros((N,N))
|
||||||
|
for i in xrange(N):
|
||||||
|
for j in xrange(N):
|
||||||
|
if j > i: continue
|
||||||
|
ii = i+1 # Fortranize it
|
||||||
|
jj = j+1 # Fortranize it
|
||||||
|
jskip = (jj-1)*N - (jj-2)*(jj-1)/2
|
||||||
|
iskip = ii - jj + 1
|
||||||
|
ldiag_index = iskip + jskip - 1 # -1 for C-izing again
|
||||||
|
# indices printed in Fortran 1-based indices
|
||||||
|
print "%5d %5d %5d %5d %5d" % (ii,jj,iskip,jskip,ldiag_index+1)
|
||||||
|
rslt[i,j] = arr_L[ldiag_index]
|
||||||
|
return rslt
|
||||||
Reference in New Issue
Block a user