Skip to content
Snippets Groups Projects
Commit d21ef66b authored by Gabriel Falk's avatar Gabriel Falk
Browse files

Upload New File

parent 7dea3b28
Branches
No related tags found
No related merge requests found
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <math.h>
#include <assert.h>
struct matrix {
float* head;
int sizeX;
int sizeY;
};
//RESHAPE bzw. CONSTRUCT with Zeroes
matrix createMx(int sizeX, int sizeY) {
matrix mx;
mx.sizeX = sizeX;
mx.sizeY = sizeY;
mx.head = (float*) malloc(sizeX * sizeY * sizeof(float));
for(int i = 0; i < sizeX*sizeY; i++){
mx.head[i] = (float) 0;
}
return mx;
}
void destroyMx(matrix x){
free(x.head);
}
// creates 1 Matrix
matrix cutMx(matrix data, int dcol, int drow, int sizeX, int sizeY) {
//Null indiziert
matrix slice = createMx(sizeX, sizeY);
int start = dcol + drow * data.sizeX;
for(int i = 0; i < (sizeX * sizeY); i++) {
int col = i % sizeX;
int row = i / sizeX;
slice.head[i] = data.head[start + col + row*data.sizeX];
}
return slice;
}
// creates 1 Matrix
matrix getConvMx(matrix filter, int inputSizeX, int inputSizeY){
int sizeInput = inputSizeX*inputSizeY;
int kernelUsesX = inputSizeX-filter.sizeX+1;
int kernelUsesY = inputSizeY-filter.sizeY+1;
int kernelUsesAA = kernelUsesX*kernelUsesY;
matrix res = createMx(sizeInput, kernelUsesAA);
for(int i = 0; i < kernelUsesAA; i++){
int Yshift = i/kernelUsesX;
int Xshift = i%kernelUsesX;
for(int j = 0; j < (filter.sizeX*filter.sizeY); j++){
res.head[(sizeInput*i)+(inputSizeX*Yshift+Xshift)+(j%filter.sizeX+(j/filter.sizeX)*inputSizeX)] = filter.head[j];
}
}
return res;
}
// creates 1 Matrix
matrix zeroPadd(matrix a, int sizeX, int sizeY){
matrix t = createMx(sizeX, sizeY);
for(int i = 0; i < t.sizeX*t.sizeY; i++){
int r = i / t.sizeX;
int c = i % t.sizeX;
if(r < a.sizeY && c < a.sizeX){
t.head[r*t.sizeX+c] = a.head[r*a.sizeX+c];
}else{
t.head[r*t.sizeX+c] = (float) 0;
}
}
return t;
}
// creates a Mx with rdm values
// creates 1 Matrix
matrix getrdmMx(int sizeX, int sizeY){
matrix r = createMx(sizeX, sizeY);
srand((unsigned int) time(NULL));
for(int i = 0; i < (sizeX*sizeY); i++){
r.head[i] = ((float) rand() / (float)(RAND_MAX));
}
return r;
}
//PRINT
void printMx(matrix data) {
printf("[");
for (int i = 0; i < (data.sizeX * data.sizeY); i++) {
if(i%data.sizeX == 0 && i != 0) printf(" ");
if (i % data.sizeX == 0) printf("[");
if(i%data.sizeX != 0) printf(", ");
printf("%f", data.head[i]);
if(i%data.sizeX == data.sizeX-1) printf("]");
if(i%data.sizeX == data.sizeX-1 && i!= (data.sizeX)*(data.sizeY)-1) printf(";\n");
}
printf("]\n\n");
}
//MATRIX EDIT
// creates 1 Matrix
matrix transpose(matrix a){
matrix t = createMx(a.sizeY, a.sizeX);
for(int i = 0; i < t.sizeY; i++){
for(int j = 0; j < t.sizeX; j++){
t.head[i*t.sizeX+j] = a.head[j*a.sizeX+i];
}
}
return t;
}
//MATRIX OPS
// creates 1 Matrix
matrix pointMulMx(matrix a, matrix b) {
//Assert: a.sizeX == b.sizeX && a.sizeY == b.sizeY
if (a.sizeX != b.sizeX || a.sizeY != b.sizeY) return createMx(0, 0);
matrix c = createMx(a.sizeX, a.sizeY);
for (int i = 0; i < (a.sizeX * a.sizeY); i++) {
c.head[i] = a.head[i] * b.head[i];
}
return c;
}
float scalMulMx(matrix a, matrix b) {
//Assert: a.sizeX == b.sizeX && a.sizeY == b.sizeY
if (a.sizeX != b.sizeX || a.sizeY != b.sizeY) return 0.0;
float sum = 0;
for (int i = 0; i < (a.sizeX * a.sizeY); i++) {
sum = sum + a.head[i] * b.head[i];
}
return sum;
}
float sumMx(matrix data) {
float sum = 0;
for (int i = 0; i < (data.sizeX * data.sizeY); i++) {
sum = sum + data.head[i];
}
return sum;
}
// creates 1 Matrix
matrix scale(matrix a, float b){
matrix c = createMx(a.sizeX, a.sizeY);
for(int i = 0; i < a.sizeX*a.sizeY; i++){
c.head[i] = b*a.head[i];
}
return c;
}
//CPU OPS
// creates 1 Matrix
matrix avg2Pooling(matrix data) {
//Assert X & Y of data %2 == 0
matrix avg = createMx(data.sizeX / 2, data.sizeY/2);
for (int i = 0; i < (avg.sizeX * avg.sizeY); i++) {
avg.head[i] = (data.head[2 * i + (i / avg.sizeX) * data.sizeX] + data.head[2 * i + (i / avg.sizeX) * data.sizeX+1] + data.head[2 * i + ((i / avg.sizeX)+1) * data.sizeX] + data.head[2 * i + ((i / avg.sizeX) + 1) * data.sizeX+1]) / 4;
}
return avg;
}
// creates 1 Matrix
matrix conv2d(matrix img, matrix filter) {
//Info: 1 filter, func: tanh
//Assert?
matrix res = createMx(img.sizeX-filter.sizeX+1, img.sizeY-filter.sizeY+1);
for (int i = 0; i < (res.sizeX * res.sizeY); i++) {
int col = i % res.sizeX;
int row = i / res.sizeX;
res.head[i] = (scalMulMx(cutMx(img, col, row, filter.sizeX, filter.sizeY), filter));
}
return res;
}
// creates 1 Matrix
matrix mulMx(matrix a, matrix b) {
assert(a.sizeX == b.sizeY);
matrix c = createMx(b.sizeX, a.sizeY);
for (int i = 0; i < (c.sizeX * c.sizeY); i++) {
int col = i % c.sizeX;
int row = i / c.sizeX;
float sum = 0.0;
for (int j = 0; j < a.sizeX; j++) {
sum = sum + a.head[row*a.sizeX+j] * b.head[col+b.sizeX*j];
}
c.head[i] = (float) sum;
//printf("Sum: %f;\n", c.head[i]);
}
return c;
}
//MATRIZEN all create 1 Matrix
matrix get2x2mat(){
matrix t = createMx(2, 2);
for(int i = 1; i < 5; i++){
t.head[i-1] = ((float) i);
}
return t;
}
matrix get3x3mat(){
matrix t = createMx(3, 3);
for(int i = 1; i < 10; i++){
t.head[i-1] = ((float) i);
}
return t;
}
matrix get3x3onesmat(){
matrix t = createMx(3, 3);
for(int i = 0; i < 9; i++){
t.head[i] = (float) 1;
}
return t;
}
matrix get3x3edgemat(){
matrix f = createMx(3, 3);
f.head[0] = 1.0;
f.head[3] = 1.0;
f.head[6] = 1.0;
f.head[1] = 0.0;
f.head[4] = 0.0;
f.head[7] = 0.0;
f.head[2] = -1.0;
f.head[5] = -1.0;
f.head[8] = -1.0;
return f;
}
matrix get4x4mat(){
matrix t = createMx(4, 4);
for(int i = 0; i < 16; i++){
t.head[i] = ((float) i);
}
return t;
}
matrix get5x5onesmat(){
matrix t = createMx(5, 5);
for(int i = 0; i < 25; i++){
t.head[i] = (float) 1;
}
return t;
}
matrix get6x6stdmat(){
matrix x = createMx(6, 6);
x.head[0] = 4.0;
x.head[1] = 9.0;
x.head[2] = 2.0;
x.head[3] = 5.0;
x.head[4] = 8.0;
x.head[5] = 3.0;
x.head[6] = 5.0;
x.head[7] = 6.0;
x.head[8] = 2.0;
x.head[9] = 4.0;
x.head[10] = 0.0;
x.head[11] = 3.0;
x.head[12] = 2.0;
x.head[13] = 4.0;
x.head[14] = 5.0;
x.head[15] = 4.0;
x.head[16] = 5.0;
x.head[17] = 2.0;
x.head[18] = 5.0;
x.head[19] = 6.0;
x.head[20] = 5.0;
x.head[21] = 4.0;
x.head[22] = 7.0;
x.head[23] = 8.0;
x.head[24] = 5.0;
x.head[25] = 7.0;
x.head[26] = 7.0;
x.head[27] = 9.0;
x.head[28] = 2.0;
x.head[29] = 1.0;
x.head[30] = 5.0;
x.head[31] = 8.0;
x.head[32] = 5.0;
x.head[33] = 3.0;
x.head[34] = 8.0;
x.head[35] = 4.0;
return x;
}
matrix get7x7onesmat(){
matrix t = createMx(7, 7);
for(int i = 0; i < 49; i++){
t.head[i] = (float) 1;
}
return t;
}
//Fractures
matrix get5x5fracmat(){
matrix w = createMx(5, 5);
for(int i = 0; i < 25; i++){
w.head[i] = ((float) i)/5;
}
return w;
}
matrix get1x10fracmat(){
matrix i = createMx(1, 10);
for(int j = 0; j < 10; j++){
i.head[j] = ((float) j)/10;
}
return i;
}
matrix get10x10fracmat(){
matrix w = createMx(10, 10);
for(int i = 0; i < 100; i++){
w.head[i] = ((float) i)/100;
}
return w;
}
matrix get16x16fracmat(){
matrix t = createMx(16, 16);
for(int i = 0; i < 256; i++){
t.head[i] = ((float) i)/100;
}
return t;
}
//WINOGRAD(5,2)
matrix get5x6WiG(){
matrix x = createMx(5, 6);
x.head[0] = 0.25;
x.head[1] = 0.0;
x.head[2] = 0.0;
x.head[3] = 0.0;
x.head[4] = 0.0;
x.head[5] = (-1.0/6.0);
x.head[6] = (-1.0/6.0);
x.head[7] = (-1.0/6.0);
x.head[8] = (-1.0/6.0);
x.head[9] = (-1.0/6.0);
x.head[10] = (-1.0/6.0);
x.head[11] = (1.0/6.0);
x.head[12] = (-1.0/6.0);
x.head[13] = (1.0/6.0);
x.head[14] = (-1.0/6.0);
x.head[15] = (1.0/24.0);
x.head[16] = (1.0/12.0);
x.head[17] = (1.0/6.0);
x.head[18] = (1.0/3.0);
x.head[19] = (2.0/3.0);
x.head[20] = (1.0/24.0);
x.head[21] = (1.0/-12.0);
x.head[22] = (1.0/6.0);
x.head[23] = (-1.0/3.0);
x.head[24] = (2.0/3.0);
x.head[25] = 0.0;
x.head[26] = 0.0;
x.head[27] = 0.0;
x.head[28] = 0.0;
x.head[29] = 1.0;
return x;
}
matrix get6x6WiB(){
matrix x = createMx(6, 6);
x.head[0] = 4.0;
x.head[1] = 0.0;
x.head[2] = 0.0;
x.head[3] = 0.0;
x.head[4] = 0.0;
x.head[5] = 0.0;
x.head[6] = 0.0;
x.head[7] = -4.0;
x.head[8] = 4.0;
x.head[9] = -2.0;
x.head[10] = 2.0;
x.head[11] = 4.0;
x.head[12] = -5.0;
x.head[13] = -4.0;
x.head[14] = -4.0;
x.head[15] = -1.0;
x.head[16] = -1.0;
x.head[17] = 0.0;
x.head[18] = 0.0;
x.head[19] = 1.0;
x.head[20] = -1.0;
x.head[21] = 2.0;
x.head[22] = -2.0;
x.head[23] = -5.0;
x.head[24] = 1.0;
x.head[25] = 1.0;
x.head[26] = 1.0;
x.head[27] = 1.0;
x.head[28] = 1.0;
x.head[29] = 0.0;
x.head[30] = 0.0;
x.head[31] = 0.0;
x.head[32] = 0.0;
x.head[33] = 0.0;
x.head[34] = 0.0;
x.head[35] = 1.0;
return x;
}
matrix get2x6WiA(){
matrix x = createMx(2, 6);
x.head[0] = 1.0;
x.head[1] = 0.0;
x.head[2] = 1.0;
x.head[3] = 1.0;
x.head[4] = 1.0;
x.head[5] = -1.0;
x.head[6] = 1.0;
x.head[7] = 2.0;
x.head[8] = 1.0;
x.head[9] = -2.0;
x.head[10] = 0.0;
x.head[11] = 1.0;
return x;
}
//WINOGRAD(3,2)
matrix get4x4WiB(){
matrix x = createMx(4, 4);
x.head[0] = 1.0;
x.head[1] = 0.0;
x.head[2] = 0.0;
x.head[3] = 0.0;
x.head[4] = 0.0;
x.head[5] = 1.0;
x.head[6] = -1.0;
x.head[7] = 1.0;
x.head[8] = -1.0;
x.head[9] = 1.0;
x.head[10] = 1.0;
x.head[11] = 0.0;
x.head[12] = 0.0;
x.head[13] = 0.0;
x.head[14] = 0.0;
x.head[15] = -1.0;
return x;
}
matrix get3x4WiG(){
matrix x = createMx(3, 4);
x.head[0] = 1.0;
x.head[1] = 0.0;
x.head[2] = 0.0;
x.head[3] = 0.5;
x.head[4] = 0.5;
x.head[5] = 0.5;
x.head[6] = 0.5;
x.head[7] = -0.5;
x.head[8] = 0.5;
x.head[9] = 0.0;
x.head[10] = 0.0;
x.head[11] = 1.0;
return x;
}
matrix get2x4WiA(){
matrix x = createMx(2, 4);
x.head[0] = 1.0;
x.head[1] = 0.0;
x.head[2] = 1.0;
x.head[3] = 1.0;
x.head[4] = 1.0;
x.head[5] = -1.0;
x.head[6] = 0.0;
x.head[7] = -1.0;
return x;
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment