File: MArrayUtil.h

package info (click to toggle)
casacore 3.8.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,912 kB
  • sloc: cpp: 471,569; fortran: 16,372; ansic: 7,416; yacc: 4,714; lex: 2,346; sh: 1,865; python: 629; perl: 531; sed: 499; csh: 201; makefile: 32
file content (132 lines) | stat: -rw-r--r-- 4,855 bytes parent folder | download | duplicates (2)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//# MArrayUtil.h: Utility functions for MArrays
//# Copyright (C) 2012
//# Associated Universities, Inc. Washington DC, USA.
//# 
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//# 
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//# 
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//# 
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: casa-feedback@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA

#ifndef CASA_MARRAYUTIL_H
#define CASA_MARRAYUTIL_H


//# Includes
#include <casacore/casa/aips.h>
#include <casacore/casa/Arrays/ArrayUtil.h>

namespace casacore { //# NAMESPACE CASACORE - BEGIN

// <summary>
// Reorder the axes of the data in an MArray object
// </summary>

// <use visibility=export>

// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="tMArrayUtil.cc">

// <synopsis>
// This function makes it possible to reorder the axes of an MArray.
// Both the data and the optional mask are reordered.
// The resulting array is a copy of the input array with its data
// moved around according to the new array order.
// If the order does not change, a copy is returned if the
// <src>alwaysCopy</src> is true. Otherwise a reference of the
// input array is returned.
// <p>
// The <src>newAxisOrder</src> defines the new axes order.
// Its length can be less than the dimensionality of the input array.
// It is appended with the non-specified axes in their natural order.
// <src>newAxisOrder(i)</src> gives the axis in the original array
// which will now get axis <src>i</src>.
// </synopsis>

// <example>
// <srcblock>
//   MArray<Int> result = reorderArray (someArray, IPosition(2,1,3));
// </srcblock>
// Say that someArray is a 4D array with shape [3,4,5,6].
// The non-specified axes get appended to the axis order
// specification [1,3] resulting in [1,3,0,2].
// <br> This means that axis 1 gets axis 0, axis 3 gets axis 1, axis 0 gets
// axis 2, and axis 2 gets axis 3.
// Thus the resulting shape is [4,6,3,5] and the data are moved accordingly.
// </example>

// <group name=reorderMArray>
template<class T>
MArray<T> reorderArray (const MArray<T>& array,
                        const IPosition& newAxisOrder,
                        Bool alwaysCopy = True)
{
  return (array.isNull()  ?
          MArray<T>() :
          (array.hasMask()  ?
           MArray<T> (reorderArray(array.array(), newAxisOrder, alwaysCopy),
                      reorderArray(array.mask(),  newAxisOrder, alwaysCopy)) :
           MArray<T> (reorderArray(array.array(), newAxisOrder, alwaysCopy))));
}
// </group>


// <summary>
// Reverse the order of one or more axes of an MArray.
// </summary>

// <use visibility=export>

// <reviewed reviewer="UNKNOWN" date="before2004/08/25" tests="tMArrayUtil.cc">

// <synopsis>
// This function makes it possible to reverse one or more axes of an MArray by
// swapping around the elements of each axis.
// Both the data and the optional mask are reversed.
// The resulting array is a copy of the input array with its data
// moved around according to the new order.
// If the order does not change, a copy is returned if the
// <src>alwaysCopy</src> is true. Otherwise a reference of the
// input array is returned.
// </synopsis>

// <example>
// Reversing axis 0 of a Vector means that the Vector is reversed.
// Reversing axis 1 of a Matrix means that its rows are reversed.
// Reversing axis 0 of an N-dim array means that the elements of each Vector
// in that array are reversed.
// </example>

// <group name=reverseMArray>
template<class T>
MArray<T> reverseArray (const MArray<T>& array,
                        const IPosition& reversedAxes,
                        Bool alwaysCopy = True)
{
  return (array.isNull()  ?
          MArray<T>() :
          (array.hasMask()  ?
           MArray<T> (reverseArray(array.array(), reversedAxes, alwaysCopy),
                      reverseArray(array.mask(),  reversedAxes, alwaysCopy)) :
           MArray<T> (reverseArray(array.array(), reversedAxes, alwaysCopy))));
}
// </group>


} //# NAMESPACE CASACORE - END

#endif