예제 #1
0
파일: nestedness.c 프로젝트: rforge/vegan
void abuswap(double *m, int *nr, int *nc, int *thin, int *direct)
{
    int row[2], col[2], k, ij[4], changed, ev ;
    double sm[4];

    GetRNGstate();

    changed = 0;
    while (changed < *thin) {
	/* Select a random 2x2 matrix*/
	 i2rand(row, *nr - 1);
	 i2rand(col, *nc - 1);
	 ij[0] = INDX(row[0], col[0], *nr);
	 ij[1] = INDX(row[1], col[0], *nr);
	 ij[2] = INDX(row[0], col[1], *nr);
	 ij[3] = INDX(row[1], col[1], *nr);
	 for (k = 0; k < 4; k ++)
	      sm[k] = m[ij[k]];
	 ev = isDiagSimple(sm);
	 /* Swap */
	 if (ev == 1) {
	      /* fixed column sums */
	      if (*direct == 0) {
		   m[ij[0]] = sm[1];
		   m[ij[1]] = sm[0];
		   m[ij[2]] = sm[3];
		   m[ij[3]] = sm[2];
	      }
	      /* fixed row sums */
	      else {
		   m[ij[0]] = sm[2];
		   m[ij[1]] = sm[3];
		   m[ij[2]] = sm[0];
		   m[ij[3]] = sm[1];
	      }
	      changed++;
	 }
    }
    
    PutRNGstate();
}
예제 #2
0
static void abuswap(double *m, int *nr, int *nc, int *thin, int *direct)
{
    int k, ij[4], changed, ev;
    size_t intcheck;
    double sm[4];
    
    /* GetRNGstate in calling C code */
    /* GetRNGstate(); */
    
    changed = 0;
    intcheck = 0;
    while (changed < *thin) {
	/* Select a random 2x2 matrix*/
	get2x2((*nr) * (*nc) - 1, *nr, ij);
	for (k = 0; k < 4; k++)
	    sm[k] = m[ij[k]];
	ev = isDiagSimple(sm);
	/* Swap */
	if (ev == 1) {
	    /* fixed column sums */
	    if (*direct == 0) {
		m[ij[0]] = sm[1];
		m[ij[1]] = sm[0];
		m[ij[2]] = sm[3];
		m[ij[3]] = sm[2];
	    }
	    /* fixed row sums */
	    else {
		m[ij[0]] = sm[2];
		m[ij[1]] = sm[3];
		m[ij[2]] = sm[0];
		m[ij[3]] = sm[1];
	    }
	    changed++;
	}
	if (intcheck % 10000 == 9999)
	    R_CheckUserInterrupt();
	intcheck++;
    }
    /* PutRNGstate(); */
}