00001
00002
00003 #ifndef TNT_ARRAY3D_UTILS_H
00004 #define TNT_ARRAY3D_UTILS_H
00005
00006 #include <cstdlib>
00007 #include <cassert>
00008
00009 namespace TNT
00010 {
00011
00012
00013 template <class T>
00014 std::ostream& operator<<(std::ostream &s, const Array3D<T> &A)
00015 {
00016 int M=A.dim1();
00017 int N=A.dim2();
00018 int K=A.dim3();
00019
00020 s << M << " " << N << " " << K << "\n";
00021
00022 for (int i=0; i<M; i++)
00023 {
00024 for (int j=0; j<N; j++)
00025 {
00026 for (int k=0; k<K; k++)
00027 s << A[i][j][k] << " ";
00028 s << "\n";
00029 }
00030 s << "\n";
00031 }
00032
00033
00034 return s;
00035 }
00036
00037 template <class T>
00038 std::istream& operator>>(std::istream &s, Array3D<T> &A)
00039 {
00040
00041 int M, N, K;
00042
00043 s >> M >> N >> K;
00044
00045 Array3D<T> B(M,N,K);
00046
00047 for (int i=0; i<M; i++)
00048 for (int j=0; j<N; j++)
00049 for (int k=0; k<K; k++)
00050 s >> B[i][j][k];
00051
00052 A = B;
00053 return s;
00054 }
00055
00056
00057
00058 template <class T>
00059 Array3D<T> operator+(const Array3D<T> &A, const Array3D<T> &B)
00060 {
00061 int m = A.dim1();
00062 int n = A.dim2();
00063 int p = A.dim3();
00064
00065 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00066 return Array3D<T>();
00067
00068 else
00069 {
00070 Array3D<T> C(m,n,p);
00071
00072 for (int i=0; i<m; i++)
00073 for (int j=0; j<n; j++)
00074 for (int k=0; k<p; k++)
00075 C[i][j][k] = A[i][j][k] + B[i][j][k];
00076
00077 return C;
00078 }
00079 }
00080
00081
00082 template <class T>
00083 Array3D<T> operator-(const Array3D<T> &A, const Array3D<T> &B)
00084 {
00085 int m = A.dim1();
00086 int n = A.dim2();
00087 int p = A.dim3();
00088
00089 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00090 return Array3D<T>();
00091
00092 else
00093 {
00094 Array3D<T> C(m,n,p);
00095
00096 for (int i=0; i<m; i++)
00097 for (int j=0; j<n; j++)
00098 for (int k=0; k<p; k++)
00099 C[i][j][k] = A[i][j][k] - B[i][j][k];
00100
00101 return C;
00102 }
00103 }
00104
00105
00106
00107
00108 template <class T>
00109 Array3D<T> operator*(const Array3D<T> &A, const Array3D<T> &B)
00110 {
00111 int m = A.dim1();
00112 int n = A.dim2();
00113 int p = A.dim3();
00114
00115 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00116 return Array3D<T>();
00117
00118 else
00119 {
00120 Array3D<T> C(m,n,p);
00121
00122 for (int i=0; i<m; i++)
00123 for (int j=0; j<n; j++)
00124 for (int k=0; k<p; k++)
00125 C[i][j][k] = A[i][j][k] * B[i][j][k];
00126
00127 return C;
00128 }
00129 }
00130
00131
00132 template <class T>
00133 Array3D<T> operator/(const Array3D<T> &A, const Array3D<T> &B)
00134 {
00135 int m = A.dim1();
00136 int n = A.dim2();
00137 int p = A.dim3();
00138
00139 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00140 return Array3D<T>();
00141
00142 else
00143 {
00144 Array3D<T> C(m,n,p);
00145
00146 for (int i=0; i<m; i++)
00147 for (int j=0; j<n; j++)
00148 for (int k=0; k<p; k++)
00149 C[i][j][k] = A[i][j][k] / B[i][j][k];
00150
00151 return C;
00152 }
00153 }
00154
00155
00156
00157 template <class T>
00158 Array3D<T>& operator+=(Array3D<T> &A, const Array3D<T> &B)
00159 {
00160 int m = A.dim1();
00161 int n = A.dim2();
00162 int p = A.dim3();
00163
00164 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00165 {
00166 for (int i=0; i<m; i++)
00167 for (int j=0; j<n; j++)
00168 for (int k=0; k<p; k++)
00169 A[i][j][k] += B[i][j][k];
00170 }
00171
00172 return A;
00173 }
00174
00175 template <class T>
00176 Array3D<T>& operator-=(Array3D<T> &A, const Array3D<T> &B)
00177 {
00178 int m = A.dim1();
00179 int n = A.dim2();
00180 int p = A.dim3();
00181
00182 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00183 {
00184 for (int i=0; i<m; i++)
00185 for (int j=0; j<n; j++)
00186 for (int k=0; k<p; k++)
00187 A[i][j][k] -= B[i][j][k];
00188 }
00189
00190 return A;
00191 }
00192
00193 template <class T>
00194 Array3D<T>& operator*=(Array3D<T> &A, const Array3D<T> &B)
00195 {
00196 int m = A.dim1();
00197 int n = A.dim2();
00198 int p = A.dim3();
00199
00200 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00201 {
00202 for (int i=0; i<m; i++)
00203 for (int j=0; j<n; j++)
00204 for (int k=0; k<p; k++)
00205 A[i][j][k] *= B[i][j][k];
00206 }
00207
00208 return A;
00209 }
00210
00211
00212 template <class T>
00213 Array3D<T>& operator/=(Array3D<T> &A, const Array3D<T> &B)
00214 {
00215 int m = A.dim1();
00216 int n = A.dim2();
00217 int p = A.dim3();
00218
00219 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00220 {
00221 for (int i=0; i<m; i++)
00222 for (int j=0; j<n; j++)
00223 for (int k=0; k<p; k++)
00224 A[i][j][k] /= B[i][j][k];
00225 }
00226
00227 return A;
00228 }
00229
00230
00231
00232
00233
00234 }
00235
00236 #endif