File: transpose.C

package info (click to toggle)
tela 1.28-2
  • links: PTS
  • area: main
  • in suites: slink
  • size: 6,596 kB
  • ctags: 5,519
  • sloc: ansic: 14,013; cpp: 13,376; lex: 1,651; fortran: 1,048; yacc: 834; sh: 715; makefile: 464
file content (72 lines) | stat: -rw-r--r-- 1,608 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * This file is part of tela the Tensor Language.
 * Copyright (c) 1994-1996 Pekka Janhunen
 */

[B] = transpose(A; P)
/* ... */
{
	Tkind k = A.kind();
	if (k!=KIntArray && k!=KRealArray && k!=KComplexArray)
		B = A;
	else {
		int d,d1,pA,pB;
		TDimPack Adims = A.dims();
		int D = Adims.rank();
		TDimPack Bdims = Adims;
		TDimPack perm;
		for (d=0; d<D; d++) perm[d] = D-d-1;
		if (Nargin == 2) {	// P given ?
			if (P.kind()==KIntArray) {
				if (P.rank()==1 && P.length()==D)
					for (d=0; d<D; d++) perm[d] = P.IntPtr()[d]-1;	// note -1: P is eg. [2,1]
				else
					return -2;
			} else
				return -1;
		}
		for (int d=0; d<D; d++) Bdims[d] = Adims[perm[d]];
		// now Adims, Bdims, D are ready
		TDimPack modulus = Adims;
		TDimPack divisor;
		for (d=0; d<D; d++) {
			divisor[d] = 1;
			for (d1=d+1; d1<D; d1++) divisor[d]*= Adims[d1];
		}
		TDimPack mult;
		for (d=0; d<D; d++) {
			mult[d] = 1;
			for (d1=d+1; d1<D; d1++) mult[d]*= Bdims[d1];
		}
		// Allocate B
		switch (k) {
		case KIntArray:
			B.ireserv(Bdims); break;
		case KRealArray:
			B.rreserv(Bdims); break;
		case KComplexArray:
			B.creserv(Bdims); break;
		default:
		}
		// Now the dirty work
		TDimPack ind;
		for (pA=0; pA<A.length(); pA++) {
			for (d=0; d<D; d++)
				ind[d] = (pA / divisor[d]) % modulus[d];
			pB = 0;
			for (d=0; d<D; d++) pB+= ind[d]*mult[d];
			switch (k) {
			case KIntArray:
				B.IntPtr()[pB] = A.IntPtr()[pA]; break;
			case KRealArray:
				B.RealPtr()[pB] = A.RealPtr()[pA]; break;
			case KComplexArray:
				B.ComplexPtr()[pB] = A.ComplexPtr()[pA]; break;
			default:
			}
		}
	}
	return 0;
}