Пример #1
0
void EigenSolver(const Matrix3x3& mtx, float* eigenValues, Vector3* eigenVecs)
{
	double roots[3] = {0.0};
	ComputeRoots(mtx, roots);
	eigenValues[0] = static_cast<float>(roots[0]);
	eigenValues[1] = static_cast<float>(roots[1]);
	eigenValues[2] = static_cast<float>(roots[2]);

	Matrix3x3 m0 = mtx - (Matrix3x3::IDENTITY * eigenValues[0]);
	int m0rank = ::ComputeRank(m0);
	if (m0rank == 0)
	{
		eigenVecs[0] = Vector3(1.0f, 0.0f, 0.0f);
		eigenVecs[1] = Vector3(0.0f, 1.0f, 0.0f);
		eigenVecs[2] = Vector3(0.0f, 0.0f, 1.0f);
		return;
	}
	else if (m0rank == 1)
	{
		GetComplement2(m0.GetRow(0), eigenVecs[0], eigenVecs[1]);
		eigenVecs[2] = eigenVecs[0].Cross(eigenVecs[1]);
		return;
	}

	// m0rank == 2
	eigenVecs[0] = GetComplement1(m0.GetRow(0), m0.GetRow(1));

	Matrix3x3 diag(
		eigenValues[1], 0.0f, 0.0f,
		0.0f, eigenValues[1], 0.0f,
		0.0f, 0.0f, eigenValues[1]);

	Matrix3x3 m1 = mtx - diag;//(Matrix3x3::IDENTITY * eigenValues[1]);
	int m1rank = ComputeRank(m1);
	if (m1rank == 1)
	{
		GetComplement2(eigenVecs[0], eigenVecs[1], eigenVecs[2]);
		return;
	}

	// m1rank == 2
	GetComplement2(eigenVecs[0], eigenVecs[1], eigenVecs[2]);
	//eigenVecs[1] = GetComplement1(m1.GetRow(0), m1.GetRow(1));

	//eigenVecs[2] = eigenVecs[0].Cross(eigenVecs[1]);
}
Пример #2
0
void Consumer::Execute(void* arg)
{
	// Your code goes here
	ThreadParam* threadParam = (ThreadParam*)arg;
	StaticRankHead headStaticRank;
	
	// 为了更大的并行计算,输出文件采用一个线程一个文件的方式
	char fname[256];
	sprintf(fname, "/data/xce/friendranknew/data/friend_rank/static_rank/static_rank.dat_%ld",
			pthread_self());
	FILE* fpRank = fopen(fname, "wb");
	assert(fpRank!=NULL);
	
	int span = 0;
	int slotpos = 0;
	while (true)
	{
		slotpos = threadParam->GetFullSlot();
		if (slotpos==-1)	{
			//threadParam->Print();
			//pthread_testcancel();   // 取消点, sem_wait也是取消点
			if (threadParam->GetDone())   // 自定义取消点机制,系统取消点实现原理也是如此
			{
				MCE_INFO("\tConsumer "<<pthread_self()<<" receive exit signal");
				break;
			}

			if (++span % 10000 == 0)
			{
				waitTime += span / 100;
				span = 0;
				MCE_INFO("\t\t\t\t\t\tConsumer "<<pthread_self()<<" wait "<<waitTime<<"s");
			}
			usleep(10000);  // microseconds
		}	else {
			ComputeRank(threadParam->dataUserModels[slotpos], headStaticRank, buffStaticRank);
			threadParam->FreeSlot(slotpos);
			SaveFriendRank(fpRank, headStaticRank, buffStaticRank);
		}
	}
	
	fclose(fpRank);
	MCE_INFO("\tConsumer "<<pthread_self()<<" exit");
}