两个函数看不懂:矩阵乘以向量跟将0/1序列压缩为比特级序列
两个函数看不懂:矩阵乘以向量和将0/1序列压缩为比特级序列
其中BYTE_LOGLEN(1字节取对数)=3 ELEM4_LOGLEN(4字节取对数)=5 BYTE_RES_MASK=0x0007 最不懂就是这三个数干嘛用的。
g_aOnesNum【256】是一个写好的数组,存了0到255每个数表示成二进制时1的个数,也不明白在这儿干嘛用
1、//矩阵乘以向量
//pMat: 比特级矩阵
//pVec: 比特级向量
//pRst: 相乘结果,每一个字节表示1个比特,用户需要提供
// 长度为pMat->aRows的向量
//返回值: 无
void bm_matXVec(PtrCnstBitMat pMat, UINT32 const *pVec,
UINT8 *pRst)
{
UINT16 i=0, j=0, rEnd=(pMat->aCols-1)>>ELEM4_LOGLEN;
UINT32 *pCur=NULL;
UINT32 tmp=0;
for(i=0;i<pMat->aRows;++i)
{
tmp=0;
pCur=(UINT32*)(pMat->ppRows[i]);
for(j=0;j<=rEnd;++j)
{
tmp^=(pCur[j]&pVec[j]);
}
pRst[i]=(g_aOnesNum[tmp&0x000000ff]+
g_aOnesNum[(tmp>>8)&0x000000ff]+
g_aOnesNum[(tmp>>16)&0x000000ff]+
g_aOnesNum[(tmp>>24)&0x000000ff])&0x01;
}
}
2、//将一个0/1序列压缩为一个比特级序列
//pVec: 0/1序列
//aCount: pVec的长度
//pBitVec: 比特级序列,每一个比特表示pVec的一个元素,用户需要提供
// ceil(aCount/32)*4字节的存储空间
//返回值: 无
void bm_getBitVec(UINT8 const *pVec, UINT16 aCount, UINT32 *pBitVec)
{
UINT16 i=0, aByteIdx=0,aBitIdx=0;
UINT8 *pTmp=(UINT8*)pBitVec;
UINT16 aBVLen=(UINT16)ceil((double)aCount/ELEM4_LEN)*sizeof(UINT32);
memset(pBitVec,0,aBVLen);
for(i=0;i<aCount;++i)
{
aByteIdx=i>>BYTE_LOGLEN;
aBitIdx=i&BYTE_RES_MASK;
pTmp[aByteIdx]|=pVec[i]<<aBitIdx;
}
}
------解决方案--------------------
给定一些测试数据,然后单步调试和设断点调试。
------解决方案--------------------
自己手动算算矩阵乘以向量,然后程序单步跟一下,对比一下计算结果。
其中BYTE_LOGLEN(1字节取对数)=3 ELEM4_LOGLEN(4字节取对数)=5 BYTE_RES_MASK=0x0007 最不懂就是这三个数干嘛用的。
g_aOnesNum【256】是一个写好的数组,存了0到255每个数表示成二进制时1的个数,也不明白在这儿干嘛用
1、//矩阵乘以向量
//pMat: 比特级矩阵
//pVec: 比特级向量
//pRst: 相乘结果,每一个字节表示1个比特,用户需要提供
// 长度为pMat->aRows的向量
//返回值: 无
void bm_matXVec(PtrCnstBitMat pMat, UINT32 const *pVec,
UINT8 *pRst)
{
UINT16 i=0, j=0, rEnd=(pMat->aCols-1)>>ELEM4_LOGLEN;
UINT32 *pCur=NULL;
UINT32 tmp=0;
for(i=0;i<pMat->aRows;++i)
{
tmp=0;
pCur=(UINT32*)(pMat->ppRows[i]);
for(j=0;j<=rEnd;++j)
{
tmp^=(pCur[j]&pVec[j]);
}
pRst[i]=(g_aOnesNum[tmp&0x000000ff]+
g_aOnesNum[(tmp>>8)&0x000000ff]+
g_aOnesNum[(tmp>>16)&0x000000ff]+
g_aOnesNum[(tmp>>24)&0x000000ff])&0x01;
}
}
2、//将一个0/1序列压缩为一个比特级序列
//pVec: 0/1序列
//aCount: pVec的长度
//pBitVec: 比特级序列,每一个比特表示pVec的一个元素,用户需要提供
// ceil(aCount/32)*4字节的存储空间
//返回值: 无
void bm_getBitVec(UINT8 const *pVec, UINT16 aCount, UINT32 *pBitVec)
{
UINT16 i=0, aByteIdx=0,aBitIdx=0;
UINT8 *pTmp=(UINT8*)pBitVec;
UINT16 aBVLen=(UINT16)ceil((double)aCount/ELEM4_LEN)*sizeof(UINT32);
memset(pBitVec,0,aBVLen);
for(i=0;i<aCount;++i)
{
aByteIdx=i>>BYTE_LOGLEN;
aBitIdx=i&BYTE_RES_MASK;
pTmp[aByteIdx]|=pVec[i]<<aBitIdx;
}
}
------解决方案--------------------
给定一些测试数据,然后单步调试和设断点调试。
------解决方案--------------------
自己手动算算矩阵乘以向量,然后程序单步跟一下,对比一下计算结果。