|
#include <stdlib.h> |
|
#include <math.h> |
|
#include <iostream> |
|
#include "Tensor.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define TEST_FUNCS(TYPE, SNAME) \ |
|
\ |
|
TYPE SNAME ## Norm(TYPE tensor[2][2][2]) { \ |
|
double result = 0; \ |
|
for (int k=0; k<2; ++k) \ |
|
for (int j=0; j<2; ++j) \ |
|
for (int i=0; i<2; ++i) \ |
|
result += tensor[k][j][i] * tensor[k][j][i]; \ |
|
return (TYPE)sqrt(result/8); \ |
|
} \ |
|
\ |
|
TYPE SNAME ## Max(TYPE * tensor, int slices, int rows, int cols) { \ |
|
int i, j, k, index; \ |
|
TYPE result = tensor[0]; \ |
|
for (k=0; k<slices; ++k) { \ |
|
for (j=0; j<rows; ++j) { \ |
|
for (i=0; i<cols; ++i) { \ |
|
index = k*rows*cols + j*cols + i; \ |
|
if (tensor[index] > result) result = tensor[index]; \ |
|
} \ |
|
} \ |
|
} \ |
|
return result; \ |
|
} \ |
|
\ |
|
TYPE SNAME ## Min(int slices, int rows, int cols, TYPE * tensor) { \ |
|
int i, j, k, index; \ |
|
TYPE result = tensor[0]; \ |
|
for (k=0; k<slices; ++k) { \ |
|
for (j=0; j<rows; ++j) { \ |
|
for (i=0; i<cols; ++i) { \ |
|
index = k*rows*cols + j*cols + i; \ |
|
if (tensor[index] < result) result = tensor[index]; \ |
|
} \ |
|
} \ |
|
} \ |
|
return result; \ |
|
} \ |
|
\ |
|
void SNAME ## Scale(TYPE array[3][3][3], TYPE val) { \ |
|
for (int k=0; k<3; ++k) \ |
|
for (int j=0; j<3; ++j) \ |
|
for (int i=0; i<3; ++i) \ |
|
array[k][j][i] *= val; \ |
|
} \ |
|
\ |
|
void SNAME ## Floor(TYPE * array, int slices, int rows, int cols, TYPE floor) { \ |
|
int i, j, k, index; \ |
|
for (k=0; k<slices; ++k) { \ |
|
for (j=0; j<rows; ++j) { \ |
|
for (i=0; i<cols; ++i) { \ |
|
index = k*rows*cols + j*cols + i; \ |
|
if (array[index] < floor) array[index] = floor; \ |
|
} \ |
|
} \ |
|
} \ |
|
} \ |
|
\ |
|
void SNAME ## Ceil(int slices, int rows, int cols, TYPE * array, TYPE ceil) { \ |
|
int i, j, k, index; \ |
|
for (k=0; k<slices; ++k) { \ |
|
for (j=0; j<rows; ++j) { \ |
|
for (i=0; i<cols; ++i) { \ |
|
index = k*rows*cols + j*cols + i; \ |
|
if (array[index] > ceil) array[index] = ceil; \ |
|
} \ |
|
} \ |
|
} \ |
|
} \ |
|
\ |
|
void SNAME ## LUSplit(TYPE tensor[2][2][2], TYPE lower[2][2][2], \ |
|
TYPE upper[2][2][2]) { \ |
|
int sum; \ |
|
for (int k=0; k<2; ++k) { \ |
|
for (int j=0; j<2; ++j) { \ |
|
for (int i=0; i<2; ++i) { \ |
|
sum = i + j + k; \ |
|
if (sum < 2) { \ |
|
lower[k][j][i] = tensor[k][j][i]; \ |
|
upper[k][j][i] = 0; \ |
|
} else { \ |
|
upper[k][j][i] = tensor[k][j][i]; \ |
|
lower[k][j][i] = 0; \ |
|
} \ |
|
} \ |
|
} \ |
|
} \ |
|
} |
|
|
|
TEST_FUNCS(signed char , schar ) |
|
TEST_FUNCS(unsigned char , uchar ) |
|
TEST_FUNCS(short , short ) |
|
TEST_FUNCS(unsigned short , ushort ) |
|
TEST_FUNCS(int , int ) |
|
TEST_FUNCS(unsigned int , uint ) |
|
TEST_FUNCS(long , long ) |
|
TEST_FUNCS(unsigned long , ulong ) |
|
TEST_FUNCS(long long , longLong ) |
|
TEST_FUNCS(unsigned long long, ulongLong) |
|
TEST_FUNCS(float , float ) |
|
TEST_FUNCS(double , double ) |
|
|