• 工作小结二


    工作小结二

    1.1 VS下的在线调试

    最近在使用VS2015进行在线调试的时候出现诡异一幕(好像之前遇到过一次):

    变量赋值之后,在线调试还是无法改变!!

    变量赋值之后,在线调试还是无法改变!!

    解决方案有两种:

    • [x] 换平台

    尽量不要在Release模式下打断点进行调试(观测的值和printf打印的值对应不上)

    在线调试使用debug,运行结果测试使用release

    • [x] 规范写代码

    这个规范包括很多方面,具体参考微软的代码规范

    比如遇到一个事情:-0.5-1.0*0.5

    前者就是通不过,后者完全可以

    1.2 负数取余

    遇到的问题总是很奇葩,-1%31=????,负数和正数的取余是多少?

    • 使用VS2015编译器进行调试,C++模式下

    -1 % 30 = -1

    • python3模式下

    -1 % 30 = 29

    到底哪个是正确的?

    网上也没具体的一些资料,都是各有各的说法,以下给出一个取余代码

    #ifndef MOD
    #define MOD(a,b) (abs(a+b) % abs(b))
    #endif
    

    1.3 opencv中cartToPolar函数

    直接上代码:

    typedef struct IMAGE_S_t
    	{
    		int rows;
    		int cols;
    		void* data;
    	}IMAGE_S;
    
    void CartToPolar(IMAGE_S*src1, IMAGE_S*src2, IMAGE_S* magnitude, IMAGE_S*angle)
    {
    	int i, j;
    	float tmpData1, tmpData2, tmpAngle;
    	assert(src1->rows == src2->rows);
    	assert(src1->rows == src2->rows);
    
    	for (i = 0; i < src1->rows; i++)
    	{
    		for ( j = 0; j < src1->cols; j++)
    		{
    			tmpData1 = *((float*)src1->data + src1->cols*i + j);
    			tmpData2 = *((float*)src2->data + src2->cols*i + j);
    			*((float*)magnitude->data + magnitude->cols*i + j) = sqrt(pow(tmpData1, 2) + pow(tmpData2, 2));
    			tmpAngle = atan2(tmpData2, tmpData1);
    			*((float*)angle->data + angle->cols*i + j) = tmpAngle < 0 ? tmpAngle + 2.*CV_PI : tmpAngle;
    		}
    	}
    	return ;
    }
    

    1.4 QR特征值和特征矩阵

    举个例子:

    // 解算[[1,1],[1,1]]
    // 矩阵不为满秩的情况下,QR的方法是解算不出来的(可能有改进的方法,网上看了几个都解算不出来)
    // 对[[0,0],[0,0]]等情况做了一些小trick
    // python结果eigenValue:[0,0]. eigenVector:[[1,0],[0,1]]
    // 基本思路没改变
    

    QP解算C代码

    Jacobi解算C代码

    小trick,做项目中正好用到:

    具体细节请参考QP解算C代码

    void ImageGetEigen(IMAGE_S* src, IMAGE_S* eigenValue, IMAGE_S* eigenVector, int iterNum)
    {
    	assert(src->rows == src->cols);
    	assert(src->rows > 0);
    	IMAGE_S temp, temp_R;
    	int i, j, k;
    	float tmpValue;
    
    	ImageCreate(&temp, src->rows, src->cols, FloatFlag);
    	ImageCreate(&temp_R, src->rows, src->cols, FloatFlag);
    	ImageCreate(eigenValue, src->rows, 1, FloatFlag);
    	ImageCreate(eigenVector, src->rows, src->cols, FloatFlag);
    	memcpy(temp.data, src->data, sizeof(float)*src->rows*src->cols);
    
    	//使用QR分解求矩阵特征值
    	for (int k = 0; k < iterNum; k++)
    	{
    		ImageQR(&temp, eigenVector, &temp_R);
    		free(temp.data);//由于ImageDot直接创建dst,所以这里得free,后期可以改进
    		ImageDot(&temp_R, eigenVector, &temp);
    	}
    
    	//获取特征值并排序
    	for (k = 0; k < temp.cols; k++)
    	{
    		tmpValue = ((float*)temp.data)[k * temp.cols + k];
    		for (i = k + 1; i < temp.cols; i++)
    		{
    			if (((float*)temp.data)[i * temp.cols + i]>tmpValue)
    			{
    				tmpValue = ((float*)temp.data)[i * temp.cols + i];
    				((float*)temp.data)[i * temp.cols + i] = ((float*)temp.data)[k * temp.cols + k];
    				((float*)temp.data)[k * temp.cols + k] = tmpValue;
    			}
    		}
    		((float*)eigenValue->data)[k] = ((float*)temp.data)[k * temp.cols + k];
    	}
    
    	ImageEig(src, eigenVector, eigenValue);
    
    	free(temp.data);
    	free(temp_R.data);
    
    	for ( i = 0; i < eigenValue->rows*eigenValue->cols; i++)
    	{
    		if (isnan(((float*)eigenValue->data)[i]))
    			((float*)eigenValue->data)[i] = 0.0f;
    	}
    	for (i = 0; i < eigenVector->rows*eigenVector->cols; i++)
    	{
    		if (isnan(((float*)eigenVector->data)[i]))
    			((float*)eigenVector->data)[i] = 0.0f;
    	}
    
    	float numT[4];
    	numT[0] = ((float*)src->data)[0 * src->cols + 0];
    	numT[1] = ((float*)src->data)[0 * src->cols + 1];
    	numT[2] = ((float*)src->data)[1 * src->cols + 0];
    	numT[3] = ((float*)src->data)[1 * src->cols + 1];
    	if (Equal(numT[0], numT[1]) && Equal(numT[0], numT[2]) && Equal(numT[0], numT[3]))
    	{
    		memset(eigenValue->data, 0, sizeof(float)*eigenValue->rows*eigenValue->cols);
    		memset(eigenVector->data, 0, sizeof(float)*eigenVector->rows*eigenVector->cols);
    		((float*)eigenVector->data)[0 * eigenVector->cols + 0] = 1;
    		((float*)eigenVector->data)[1 * eigenVector->cols + 1] = 1;
    	}
    
    	return;
    }
    

    1.5 关于二进制的读取问题

    举个例子:

    假设有一批数据 2019-01-11 0x01 0x32 0x41, 2019-01-11 0x01 0x32 0x41, 2019-01-11 0x01 0x32 0x41,等 1W 行
    我现在想保存这些数据,并且读取出来

    轻而易举的想法是fopen,接着使用fprintf进行操作
    二进制的话,使用fopenfwritefread
    这里涉及到一个换行,二进制怎么换行?
    其实二进制根本不用考虑换行的问题,直接进行保存读写就行了

    
    #if 1
    	unsigned char flag_t = 0;
    	if (flag_t)
    	{
    		FILE* fp_test = fopen("./data.bat", "wb");
    		struct XXX *frameinfo = new XXX[3];
    		for (size_t i = 0; i < 3; i++)
    		{
    			frameinfo[i].ID = i;
    			frameinfo[i].TimeStamp = i + 1;
    			frameinfo[i].TimeFlag = i + 2;
    			frameinfo[i].SendType = i + 3;
    			frameinfo[i].RemoteFlag = i + 4;
    			frameinfo[i].ExternFlag = i + 5;
    			frameinfo[i].DataLen = i + 6;
    			unsigned char ppp[8] = { i,i + 1,i,i + 2,i + 3,i + 4,i + 5,i + 6 };
    			memcpy(frameinfo[i].Data, ppp, sizeof(unsigned char) * 8);
    			memcpy(frameinfo[i].Reserved, ppp, sizeof(unsigned char) * 3);
    		}
    		double curtime;
    		for (int index_frame = 0; index_frame < 3; index_frame++)
    		{
    			fwrite(&curtime, sizeof(double), 1, fp_test);
    			fwrite(&frameinfo[index_frame], sizeof(XXX), 1, fp_test);
    			fflush(fp_test);
    		}
    	}
    	else
    	{
    
    		FILE* fp_test = fopen(".//data//pic_20191030_183053_can0.bat", "rb");
    		XXX frameinfo = new XXX[3];
    		double time;
    		for (size_t i = 0; i < 300000; i++)
    		{
    			fread(&time, sizeof(double), 1, fp_test);
    			fread(&frameinfo[0], sizeof(XXX), 1, fp_test);
    			Sleep(5);
    		}
    	}
    #endif	
    
    
  • 相关阅读:
    46. 全排列
    90. 子集 II
    289. 生命游戏
    844. 比较含退格的字符串
    1266. 访问所有点的最小时间
    707. 设计链表
    DOM 关于dom的
    插件库
    浏览器判断
    FTP 客户端安装
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/11729139.html
Copyright © 2020-2023  润新知