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

📄 checkcycle6.c

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

#define  NONE 0xFFFFFFFF
#define  CYCLELEN 6

struct HPoint
{
    int i;
    int j;
};

void docheck(double *c6num, 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
//c6num=checkcycle6(h1idx)
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray*prhs[] )
{
    //output
    double *c6num;  //pointer variable for output c6num

    //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);
    c6num = mxGetPr(plhs[0]);

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

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

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

}

void docheck(double *c6num, double *h1idx, int rows, int cols)
{
    int c0, c1, c2;
    double *c0base, *c1base, *c2base;
    int r00, r01;
    int r10, r11;
    int r20, r21;
//    int ccnt;
    struct HPoint p[CYCLELEN];

//    ccnt = 0;

    for (c0=0;   c0<cols-2;c0++)
    for (c1=c0+1;c1<cols-1;c1++)
    for (c2=c1+1;c2<cols;  c2++)
    {
        c0base = h1idx+c0*rows;
        c1base = h1idx+c1*rows;
        c2base = h1idx+c2*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++)
        {
            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;
            if (iscycle(p))
            {
                mexPrintf("(%d %d),(%d %d),(%d %d),(%d %d),(%d %d),(%d %d)\n", p[0].i, p[0].j, p[1].i, p[1].j, p[2].i, p[2].j, p[3].i, p[3].j, p[4].i, p[4].j, p[5].i, p[5].j);
//                ccnt++;
				*c6num = 1;
				return;
            }
        }
    }

//    *c6num = 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 + -