⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 checkcycle12.c

📁 ldpc码中
💻 C
字号:
#include <mex.h>
#include <matrix.h>
#include <math.h>

#define  NONE 0xFFFFFFFF
#define  CYCLELEN 12

struct HPoint
{
    int i;
    int j;
};

void docheck(double *c12num, double **h1idx, int rows, int cols);
bool iscycle(struct HPoint *p);
int  findnext(struct HPoint *p, int startp);
void exchange(struct HPoint *p, int idx1, int idx2);

//  0                0
//c12num=checkcycle12(h1idx)
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray*prhs[] )
{
    //output
    double *c12num;  //pointer variable for output c12num

    //input parameter
    double *h1idx;  //pointer variable for input matrix h1idx

    //local variable
    double rows;    //h1idx matrix rows
    double cols;    //h1idx matrix cols

    //output
    plhs[0] = mxCreateDoubleScalar(0);
    c12num = mxGetPr(plhs[0]);

    //input parameter
    h1idx = mxGetPr(prhs[0]);

    //local variable
    rows = mxGetM(prhs[0]);
    cols = mxGetN(prhs[0]);

    docheck(c12num, h1idx, (int)rows, (int)cols);

}

void docheck(double *c12num, double *h1idx, int rows, int cols)
{
    int c0, c1, c2, c3, c4, c5;
    double *c0base, *c1base, *c2base, *c3base, *c4base, *c5base;
    int r00, r01;
    int r10, r11;
    int r20, r21;
    int r30, r31;
    int r40, r41;
    int r50, r51;
//    int ccnt;
    struct HPoint p[CYCLELEN];

//    ccnt = 0;

    for (c0=0;   c0<cols-5;c0++)
    for (c1=c0+1;c1<cols-4;c1++)
    for (c2=c1+1;c2<cols-3;c2++)
    for (c3=c2+1;c3<cols-2;c3++)
    for (c4=c3+1;c4<cols-1;c4++)
    for (c5=c4+1;c5<cols;  c5++)
    {
        c0base = h1idx+c0*rows;
        c1base = h1idx+c1*rows;
        c2base = h1idx+c2*rows;
        c3base = h1idx+c3*rows;
        c4base = h1idx+c4*rows;
        c5base = h1idx+c5*rows;
        for (r00=1;r00<(int)*c0base;r00++)
        for (r01=r00+1;r01<=(int)*c0base;r01++)
        for (r10=1;r10<(int)*c1base;r10++)
        for (r11=r10+1;r11<=(int)*c1base;r11++)
        for (r20=1;r20<(int)*c2base;r20++)
        for (r21=r20+1;r21<=(int)*c2base;r21++)
        for (r30=1;r30<(int)*c3base;r30++)
        for (r31=r30+1;r31<=(int)*c3base;r31++)
        for (r40=1;r40<(int)*c4base;r40++)
        for (r41=r40+1;r41<=(int)*c4base;r41++)
        for (r50=1;r50<(int)*c5base;r50++)
        for (r51=r50+1;r51<=(int)*c5base;r51++)
        {
            p[0].i = (int)*(c0base+r00);
            p[0].j = c0+1;
            p[1].i = (int)*(c0base+r01);
            p[1].j = c0+1;
            p[2].i = (int)*(c1base+r10);
            p[2].j = c1+1;
            p[3].i = (int)*(c1base+r11);
            p[3].j = c1+1;
            p[4].i = (int)*(c2base+r20);
            p[4].j = c2+1;
            p[5].i = (int)*(c2base+r21);
            p[5].j = c2+1;
            p[6].i = (int)*(c3base+r30);
            p[6].j = c3+1;
            p[7].i = (int)*(c3base+r31);
            p[7].j = c3+1;
            p[8].i = (int)*(c4base+r40);
            p[8].j = c4+1;
            p[9].i = (int)*(c4base+r41);
            p[9].j = c4+1;
            p[10].i = (int)*(c5base+r50);
            p[10].j = c5+1;
            p[11].i = (int)*(c5base+r51);
            p[11].j = c5+1;
            if (iscycle(p))
            {
                mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),",  p[0].i, p[0].j, p[1].i, p[1].j, p[2].i, p[2].j, p[3].i, p[3].j);
                mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),",  p[4].i, p[4].j, p[5].i, p[5].j, p[6].i, p[6].j, p[7].i, p[7].j);
                mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d)\n", p[8].i, p[8].j, p[9].i, p[9].j, p[10].i, p[10].j, p[11].i, p[11].j);
//                ccnt++;
				*c12num = 1;
				return;
            }
        }
    }

//    *c12num = ccnt;
//    return;
}

bool iscycle(struct HPoint *p)
{
    int i;
    int nextpoint;

    for (i=1;i<CYCLELEN;i++)
    {
        nextpoint = findnext(p,i);
        if (nextpoint==NONE)
            return false;
        else if (nextpoint!=i)
            exchange(p, i, nextpoint);
    }

    if (p[0].i==p[CYCLELEN-1].i)
        return true;
    else
        return false;

}

int findnext(struct HPoint *p, int startp)
{
    int i;

    i = startp;
    if (startp%2==1)
    {
        while (i<CYCLELEN && p[startp-1].j!=p[i].j)
            i++;
        if (i==CYCLELEN)
            i = NONE;
    }
    else
    {
        while (i<CYCLELEN && p[startp-1].i!=p[i].i)
            i++;
        if (i==CYCLELEN)
            i = NONE;
    }

    return i;

}

void exchange(struct HPoint *p, int idx1, int idx2)
{
    int temp;

    temp = p[idx1].i;
    p[idx1].i = p[idx2].i;
    p[idx2].i = temp;

    temp = p[idx1].j;
    p[idx1].j = p[idx2].j;
    p[idx2].j = temp;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -