工做小結二

工做小結二

1.1 VS下的在線調試

最近在使用VS2015進行在線調試的時候出現詭異一幕(好像以前遇到過一次):git

變量賦值以後,在線調試仍是沒法改變!!github

變量賦值以後,在線調試仍是沒法改變!!函數

解決方案有兩種:測試

  • [x] 換平臺

儘可能不要在Release模式下打斷點進行調試(觀測的值和printf打印的值對應不上).net

在線調試使用debug,運行結果測試使用releasedebug

  • [x] 規範寫代碼

這個規範包括不少方面,具體參考微軟的代碼規範調試

好比遇到一個事情:-0.5-1.0*0.5代碼規範

前者就是通不過,後者徹底能夠code

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
相關文章
相關標籤/搜索