Ejemplo n.º 1
0
long long int  * fastPowerMatrix(long long int  *a,long long int  size,long long int  power) { 
	
	int i;
	long long int  * temp;

	long long int  *tempTable = malloc(size*size*sizeof(long long int ));  
	
	long long int  * res = calloc(size*size,sizeof(long long int ));  //αρχικοποίηση σε μοναδιαίο πίνακα
	for (i=0;i<size;i++)
		*(res+i*size+i)=1;
	
	while(power>0) {
	

		if(power&1) {
			matrixMul(a,res,tempTable,size);
			temp = res;
			res = tempTable;
			tempTable = temp;
		}
			
		power = power>>1;
		matrixMul(a,a,tempTable,size);
		temp = a;
		a = tempTable;
		tempTable = temp;
	}
	

	return res;
	

}
Ejemplo n.º 2
0
int main(int argc, char const *argv[])
{

	Matrix a = matrixNew(555555, 2);
	Matrix b = matrixNew(2, 555555);
	//Matrix b = matrixNew(100, 100);
	for (int i = 0; i < matrixGetRows(a); i++) {
		for (int j = 0; j < matrixGetCols(a); j++) {
			//printf("%d ", (i + 5));		
			matrixSet(a, i, j, (float) (i + 5));		
		}
	//	printf("\n");
	}
	for (int i = 0; i < matrixGetRows(b); i++) {
		for (int j = 0; j < matrixGetCols(b); j++) {
			matrixSet(b, i, j, (float) 1.);		
		}
	}
	//printMatrix(a);
	//printMatrix(b);
	Matrix c = matrixMul(a, b);
	//Matrix c = matrixNew(9, 13);
	printf("\n%d\n-----", (int) c);
	printMatrix(c);	
	return 0;
}
Ejemplo n.º 3
0
Mat matrixAllocMul(Mat a, Mat b) {
	Mat dest;

	dest = matrixAlloc(a.row, b.clm);
	matrixMul(dest, a, b);
	return dest;
}
Ejemplo n.º 4
0
int GzPushMatrix(GzRender *render, GzMatrix	matrix)
{
/*
- push a matrix onto the Ximage stack
- check for stack overflow
*/
	if(render->matlevel>=MATLEVELS)
		return GZ_FAILURE;
	if(render->matlevel==-1)
	{
		render->matlevel++;
		int i=render->matlevel + 1;
		memcpy(render->Ximage[render->matlevel],matrix,sizeof(GzMatrix));
		//return GZ_SUCCESS;
	}
	else
	{
		int i=render->matlevel;
		matrixMul(render->Ximage[i],matrix,render->Ximage[render->matlevel+1]);
		render->matlevel++;
	//	return GZ_SUCCESS;
	}
	
	if(render->matlevel==0 || render->matlevel==1)
		memcpy(render->Xnorm[render->matlevel],defaultMatrix,sizeof(GzMatrix));
	else
	{
	float scaleFactor=0.0;
	GzMatrix temp;
	memcpy(temp,matrix,sizeof(GzMatrix));
	temp[0][3]=0;
	temp[1][3]=0;
	temp[2][3]=0;
	temp[3][3]=1;

	float f=sqrt(temp[0][0]*temp[0][0] + temp[1][0]*temp[1][0] + temp[2][0]*temp[2][0]);
	scaleFactor=1/f;
	for (int i=0;i<3;i++)
	  {
	    for(int j=0;j<3;j++)
			temp[i][j] = temp[i][j]*scaleFactor;		
	  }
	f=0.0;
	matrixMul(render->Xnorm[render->matlevel-1],temp, render->Xnorm[render->matlevel]);
	}
	return GZ_SUCCESS;
}
Ejemplo n.º 5
0
int main()
{
    printf("Testing work:\n");
    int n = 9;
    int m = 1;
    Matrix a = matrixNew(n, m);
    for (int i = 0; i < matrixGetRows(a); i++)
        for (int j = 0; j < matrixGetCols(a); j++)
            matrixSet(a, i, j, (float)(i + 1) / (j + 1));
    for (int i = 0; i < matrixGetRows(a); i++)
    {
        for (int j = 0; j < matrixGetCols(a); j++)
            printf("%.5f ", matrixGet(a, i, j));
        printf("\n");
    }
    printf("\n");
    Matrix b = matrixScale(a, 10);
    for (int i = 0; i < matrixGetRows(b); i++)
    {
        for (int j = 0; j < matrixGetCols(b); j++)
            printf("%.5f ", matrixGet(b, i, j));
        printf("\n");
    }
    printf("\n");
    Matrix c = matrixAdd(a, b);
    for (int i = 0; i < matrixGetRows(c); i++)
    {
        for (int j = 0; j < matrixGetCols(c); j++)
            printf("%.5f ", matrixGet(c, i, j));
        printf("\n");
    }
    printf("\n");
    Matrix d = matrixTranspose(c);
    for (int i = 0; i < matrixGetRows(d); i++)
    {
        for (int j = 0; j < matrixGetCols(d); j++)
            printf("%.5f ", matrixGet(d, i, j));
        printf("\n");
    }

    /*c = matrixAdd(a, matrixNew(1, 1));
    if (c == NULL)
        printf("Yeah\n"), c = matrixNew(3, 3);*/
    Matrix e = matrixMul(c, d);
    printf("%i %i\n", matrixGetRows(e), matrixGetCols(e));
    for (int i = 0; i < matrixGetRows(e); i++)
    {
        for (int j = 0; j < matrixGetCols(e); j++)
            printf("%.5f ", matrixGet(e, i, j));
        printf("\n");
    }
    matrixDelete(a);
    matrixDelete(b);
    matrixDelete(c);
    matrixDelete(d);
    matrixDelete(e);
	return 0;
}
Ejemplo n.º 6
0
Archivo: main.cpp Proyecto: goTJ/tj
void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	vector<Triangle> &tri_vec=triModel[model_idx].triangleList;
	double ver[3][3];
    double tmp[3], tmp2[3];
	
    for(vector<Triangle>::iterator iter=tri_vec.begin(); iter!=tri_vec.end(); iter++){
        double normal[3];
        int n=0;
        for(int i=0; i<3; i++){
            matrixMul(matrix, iter->vertex[i], ver[n]);
            matrixMul3(nowView->matrix, iter->normal[i], tmp);
            matrixMul(nowView->matrix, iter->vertex[i], tmp2);
            normal[n] = 0.0;
            for(int j=0; j<3; j++)
                normal[n] -= tmp2[j]*tmp[j];
            normal[n] /= sqrt(tmp2[0]*tmp2[0]+tmp2[1]*tmp2[1]+tmp2[2]*tmp2[2]);
            n++;
        }
        for(int i=0; i<n; i++){
            if(normal[i]+normal[(i+1)%n] > -0.3)
            	glColor3f((double)iter->foreColor[0]/255, (double)iter->foreColor[1]/255, (double)iter->foreColor[2]/255);
            else{
                continue;
            	glColor3f((double)iter->backColor[0]/255, (double)iter->backColor[1]/255, (double)iter->backColor[2]/255);
            }
            double v1[3], v2[3];
            if(insertNode(ver[i], ver[(i+1)%n], v1, v2)){
            	glBegin(GL_LINES);
            	glVertex2f(v1[0]*WINDOW_SIZE_X/2+WINDOW_SIZE_X/2, v1[1]*WINDOW_SIZE_Y/2+WINDOW_SIZE_Y/2);
            	glVertex2f(v2[0]*WINDOW_SIZE_X/2+WINDOW_SIZE_X/2, v2[1]*WINDOW_SIZE_Y/2+WINDOW_SIZE_Y/2);
            	glEnd();
            }
        }
    }
	glutSwapBuffers();
}
Ejemplo n.º 7
0
Archivo: main.cpp Proyecto: goTJ/tj
void initialize(){
    aov = 120;
    zNear = 100;
    zFar = 1000;
	genPM(pm);
	
	for(int i=0; i<MODEL_NUM; i++){
		if(!triModel[i].loadFromFile(modelName[i])){
			fprintf(stderr, "Can't load file %s\n", modelName[i]);
			exit(-1);
		}
		view[i].init(triModel[i].center, (zFar-zNear)/2);
	}
	nowView = &view[0];
	matrixMul(pm, nowView->matrix, matrix);
}
Ejemplo n.º 8
0
int main(void) {
    int mat[6] = {2,6,5,3,7,8};
    int mat2[6] = {2,4,8,3,1,5};
    matrix x, y;
    x.row = 2;
    x.col = 3;
    x.content = mat;
    y.row = 3;
    y.col = 2;
    y.content = mat2;
    matrix z;
    z = matrixMul(x, y);
    for(int i = 0; i<z.row; i++){
        for(int j = 0; j<z.col; j++) 
            printf("%d\t",*(z.content+i*z.col+j));
        printf("\n");
    }
    return 0;
}
Ejemplo n.º 9
0
int GzPushMatrix(GzRender *render, GzMatrix	matrix)
{
/*
- push a matrix onto the Ximage stack
- check for stack overflow
*/
	//init if render->matlevel = -1
	if(render->matlevel == -1){
		initMatrix(&(render->Ximage[0]),4);
		(render->Ximage[0])[0][0] = 1;
		(render->Ximage[0])[1][1] = 1;
		(render->Ximage[0])[2][2] = 1;
		(render->Ximage[0])[3][3] = 1;
		render->matlevel += 1;
	}
	
	if(render->matlevel > -1)
	{
		if (render->matlevel < MATLEVELS - 1)
		{
			//GzMatrix tempMatrix;
			//matrixCopy(matrix, &tempMatrix,4,4);
			render->matlevel += 1;
			initMatrix(&(render->Ximage[render->matlevel]),4);
			matrixMul(render->Ximage[render->matlevel-1], matrix, &(render->Ximage[render->matlevel]),4,4,4);
		}else
		{
			errorCall("GzPushMatrix","matlevel >= MATLEVELS");
			AfxMessageBox( "Matrix has full\n" );
			return GZ_FAILURE;
		}
	}else
	{
		errorCall("GzPushMatrix", "render->matlevel < -1");
		//return GZ_FAILURE;
	}

	return GZ_SUCCESS;
}
Ejemplo n.º 10
0
int GzPushMatrix(GzRender *render, GzMatrix	matrix)
{
/*
- push a matrix onto the Ximage stack
- check for stack overflow
*/
	if(render->matlevel>=MATLEVELS)
		return GZ_FAILURE;
	if(render->matlevel==-1)
	{
		render->matlevel++;
		int i=render->matlevel++;
		memcpy(render->Ximage[render->matlevel],matrix,sizeof(GzMatrix));
		return GZ_SUCCESS;
	}
	else
	{
		int i=render->matlevel;
		matrixMul(render->Ximage[i],matrix,render->Ximage[render->matlevel+1]);
		render->matlevel++;
		return GZ_SUCCESS;
	}
	
}
Ejemplo n.º 11
0
Archivo: main.cpp Proyecto: CCJY/coliru
int main() {
	using matrix_t = std::vector<std::vector<float>>;
	using matrix_aligned_t = std::vector<std::vector<float, aligned_allocator<float, 32>>>;
	assert(testMatrixMul<matrix_t>(*matrixMul<matrix_t>));
	assert(testMatrixMul<matrix_aligned_t>(*matrixMulFMA<matrix_aligned_t>));
	assert(testMatrixMul<matrix_t>(*matrixMulRotated<matrix_t>));
	assert(testMatrixMul<matrix_t>(*matrixMulTiled<matrix_t>));
	assert(testMatrixMul<matrix_t>(*matrixMulUnrolled<matrix_t>));
	assert(testGaussSeidel());

	std::cout << "benching gaussSeidelIteration with different Sizes" << std::endl;
	{
		auto iterationsGaussSeidel = [](size_t size) -> int {return 50000000/static_cast<int>(std::pow(size, 2)) + 1;};//reduce iterations by complexity
		auto opsPerIterationGaussSeidel = [](size_t size) -> double {return std::pow(size, 2)*4;};
		auto functionGaussSeidel = [](matrix_t & matrix) -> std::remove_reference<decltype(matrix)>::type {return gaussSeidelIteration(matrix);};
		measure<matrix_t>(16384, iterationsGaussSeidel, opsPerIterationGaussSeidel, functionGaussSeidel);
	}

	std::cout << std::endl;
	std::cout << "benching MatrixMul with different Sizes" << std::endl;
	auto iterationsMatrixMul = [](size_t size) -> int {return 100000000/static_cast<int>(std::pow(size, 2.7)) + 1;};//reduce iterations by complexity
	auto opsPerIterationMatrixMul = [](size_t size) -> double {return std::pow(size, 3)*2;};
	{
		auto functionMatrixMul = [](matrix_t & matrix) -> std::remove_reference<matrix_t>::type {return matrixMul(matrix, matrix);};
		measure<matrix_t>(2048, iterationsMatrixMul, opsPerIterationMatrixMul, functionMatrixMul);
	}
	std::cout << std::endl;
	std::cout << "benching MatrixMulFMA with different Sizes" << std::endl;
	{
		auto functionMatrixMulFMA = [](matrix_aligned_t & matrix) -> std::remove_reference<matrix_aligned_t>::type {return matrixMulFMA(matrix, matrix);};
		measure<matrix_aligned_t>(2048, iterationsMatrixMul, opsPerIterationMatrixMul, functionMatrixMulFMA);
	}
	std::cout << std::endl;
	std::cout << "benching matrixMulRotated with different Sizes" << std::endl;
	{
		auto functionMatrixMul = [](matrix_t & matrix) -> std::remove_reference<matrix_t>::type {return matrixMulRotated(matrix, matrix);};
		measure<matrix_t>(2048, iterationsMatrixMul, opsPerIterationMatrixMul, functionMatrixMul);
	}
	std::cout << std::endl;
	std::cout << "benching matrixMulTiled with different Sizes" << std::endl;
	{
		auto functionMatrixMul = [](matrix_t & matrix) -> std::remove_reference<matrix_t>::type {return matrixMulTiled(matrix, matrix);};
		measure<matrix_t>(2048, iterationsMatrixMul, opsPerIterationMatrixMul, functionMatrixMul);
	}
	std::cout << std::endl;
	std::cout << "benching matrixMulUnrolled with different Sizes" << std::endl;
	{
		auto functionMatrixMul = [](matrix_t & matrix) -> std::remove_reference<matrix_t>::type {return matrixMulUnrolled(matrix, matrix);};
		measure<matrix_t>(2048, iterationsMatrixMul, opsPerIterationMatrixMul, functionMatrixMul);
	}
}
Ejemplo n.º 12
0
Archivo: main.cpp Proyecto: goTJ/tj
void keyboard(unsigned char key, int x, int y){
	switch(key){
		case 'z':
			exit(0);
			break;
		case 'v':
            model_idx = (model_idx+1)%MODEL_NUM;
            nowView = &view[model_idx];
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'c':
            model_idx = (model_idx+MODEL_NUM-1)%MODEL_NUM;
            nowView = &view[model_idx];
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'd':  // scale + all
            for(int i=0; i<3; i++)
                nowView->scale[i] *= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'f':  // scale + x
            nowView->scale[0] *= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'e':  // scale + y
            nowView->scale[1] *= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'r':  // scale + z
            nowView->scale[2] *= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 's':  // scale - all
            for(int i=0; i<3; i++)
                nowView->scale[i] /= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'a':  // scale + x
            nowView->scale[0] /= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'w':  // scale - y
            nowView->scale[1] /= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'q':  // scale + z
            nowView->scale[2] /= SCALE_RATE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'l':  // translate + all
            for(int i=0; i<3; i++)
                nowView->translate[i] += TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case ';':  // translate + x
            nowView->translate[0] += TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'o':  // translate + y
            nowView->translate[1] += TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'p':  // translate + z
            nowView->translate[2] += TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'k':  // translate - all
            for(int i=0; i<3; i++)
                nowView->translate[i] -= TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'j':  // translate - x
            nowView->translate[0] -= TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'i':  // translate - y
            nowView->translate[1] -= TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'u':  // translate - z
            nowView->translate[2] -= TRANSLATE_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '8':  // rotate + x
            nowView->rotate[0] += ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '5':  // rotate - x
            nowView->rotate[0] -= ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '6':  // rotate + y
            nowView->rotate[1] += ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '4':  // rotate - y
            nowView->rotate[1] -= ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '9':  // rotate + z
            nowView->rotate[2] += ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '7':  // rotate - z
            nowView->rotate[2] -= ROTATE_DEGREE;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '.':  // shear + x
            nowView->shear[0] += SHEAR_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case ',':  // shear - x
            nowView->shear[0] -= SHEAR_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '/':  // shear + y
            nowView->shear[1] += SHEAR_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'm':  // shear - y
            nowView->shear[1] -= SHEAR_STEP;
            nowView->genMM();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
    	case '[':  // lookat rotate + y
            nowView->lRotate[1] += LROTATE_DEGREE;
            nowView->genLookAt();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
    	case ']':  // lookat rotate - y
            nowView->lRotate[1] -= LROTATE_DEGREE;
            nowView->genLookAt();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '=':  // lookat translate + y
            nowView->lTranslate[1] += LTRANSLATE_STEP;
            nowView->genLookAt();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case '-':  // lookat translate- y
            nowView->lTranslate[1] -= LTRANSLATE_STEP;
            nowView->genLookAt();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
		case 'x':  // reset
            nowView->reset();
          	matrixMul(pm, nowView->matrix, matrix);
			glutPostRedisplay();
			break;
	}
}