Exemple #1
0
void dd (header *hd)
{	header *st=hd,*hd1,*result;
	int c1,c2,i,j,r;
	double *m1,*m2,*mr;
	complex *mc1,*mc2,*mcr,hc1,hc2;
	interval *mi1,*mi2,*mir,hi1,hi2;
	hd1=next_param(st);
	equal_params_2(&hd,&hd1); if (error) return;
	getmatrix(hd,&r,&c1,&m1); if (r!=1) wrong_arg();
	getmatrix(hd1,&r,&c2,&m2); if (r!=1) wrong_arg();
	if (c1!=c2) wrong_arg();
	if (iscomplex(hd)) /* complex values */
	{	mc1=(complex *)m1; mc2=(complex *)m2;
		result=new_cmatrix(1,c1,""); if (error) return;
		mcr=(complex *)matrixof(result);
		memmove((char *)mcr,(char *)mc2,c1*sizeof(complex));
		for (i=1; i<c1; i++)
		{	for (j=c1-1; j>=i; j--)
			{	if (mc1[j][0]==mc1[j-i][0] &&
					mc1[j][1]==mc1[j-i][1]) wrong_arg();
				c_sub(mcr[j],mcr[j-1],hc1);
				c_sub(mc1[j],mc1[j-i],hc2);
				c_div(hc1,hc2,mcr[j]);
			}
		}
	}
	else if (isinterval(hd)) /* complex values */
	{	mi1=(complex *)m1; mi2=(complex *)m2;
		result=new_imatrix(1,c1,""); if (error) return;
		mir=(interval *)matrixof(result);
		memmove((char *)mir,(char *)mi2,c1*sizeof(interval));
		for (i=1; i<c1; i++)
		{	for (j=c1-1; j>=i; j--)
			{	i_sub(mir[j],mir[j-1],hi1);
				if (hi1[0]<=0 && hi1[1]>=0)
				{	output("Interval points coincide\n");
					error=1; return;
				}
				i_sub(mi1[j],mi1[j-i],hi2);
				i_div(hi1,hi2,mir[j]);
			}
		}
	}
	else if (isreal(hd))
	{	result=new_matrix(1,c1,""); if (error) return;
		mr=matrixof(result);
		memmove((char *)mr,(char *)m2,c1*sizeof(double));
		for (i=1; i<c1; i++)
		{	for (j=c1-1; j>=i; j--)
			{	if (m1[j]==m1[j-i]) wrong_arg();
				mr[j]=(mr[j]-mr[j-1])/(m1[j]-m1[j-i]);
			}
		}	
	}
	else wrong_arg();
	moveresult(st,result);
}
Exemple #2
0
void polymult (header *hd)
{	header *st=hd,*hd1,*result;
	int c,c1,c2,i,r,j,k;
	double *m1,*m2,*mr,x;
	complex *mc1,*mc2,*mcr,xc,hc;
	interval *mi1,*mi2,*mir,xi,hi;
	hd1=next_param(st);
	equal_params_2(&hd,&hd1); if (error) return;
	getmatrix(hd,&r,&c1,&m1); if (r!=1) wrong_arg();
	getmatrix(hd1,&r,&c2,&m2); if (r!=1) wrong_arg();
	if ((LONG)c1+c2-1>INT_MAX) wrong_arg();
	c=c1+c2-1;
	if (iscomplex(hd))
	{	mc1=(complex *)m1; mc2=(complex *)m2;
		result=new_cmatrix(1,c,""); if (error) return;
		mcr=(complex *)matrixof(result);
		c_copy(xc,*mc1); mc1++;
		for (i=0; i<c2; i++) c_mult(xc,mc2[i],mcr[i]);
		for (j=1; j<c1; j++)
		{	c_copy(xc,*mc1); mc1++;
			for (k=j,i=0; i<c2-1; i++,k++)
			{	c_mult(xc,mc2[i],hc);
				c_add(hc,mcr[k],mcr[k]);
			}
			c_mult(xc,mc2[i],mcr[k]);
		}
	}
	else if (isinterval(hd))
	{	mi1=(interval *)m1; mi2=(interval *)m2;
		result=new_imatrix(1,c,""); if (error) return;
		mir=(interval *)matrixof(result);
		i_copy(xi,*mi1); mi1++;
		for (i=0; i<c2; i++) i_mult(xi,mi2[i],mir[i]);
		for (j=1; j<c1; j++)
		{	i_copy(xi,*mi1); mi1++;
			for (k=j,i=0; i<c2-1; i++,k++)
			{	i_mult(xi,mi2[i],hi);
				c_add(hi,mir[k],mir[k]);
			}
			c_mult(xi,mi2[i],mir[k]);
		}
	}
	else if (isreal(hd))
	{	result=new_matrix(1,c,""); if (error) return;
		mr=matrixof(result);
		x=*m1++;
		for (i=0; i<c2; i++) mr[i]=x*m2[i];
		for (j=1; j<c1; j++)
		{	x=*m1++;
			for (k=j,i=0; i<c2-1; i++,k++) mr[k]+=x*m2[i];
			mr[k]=x*m2[i];
		}
	}
	else wrong_arg();
	moveresult(st,result);
}
Exemple #3
0
void polyadd (header *hd)
{	header *st=hd,*hd1,*result;
	int c,c1,c2,i,r;
	double *m1,*m2,*mr;
	complex *mc1,*mc2,*mcr;
	interval *mi1,*mi2,*mir;
	hd1=next_param(st);
	equal_params_2(&hd,&hd1); if (error) return;
	getmatrix(hd,&r,&c1,&m1); if (r!=1) wrong_arg();
	getmatrix(hd1,&r,&c2,&m2); if (r!=1) wrong_arg();
	c=max(c1,c2);
	if (iscomplex(hd)) /* complex values */
	{	mc1=(complex *)m1; mc2=(complex *)m2;
		result=new_cmatrix(1,c,""); if (error) return;
		mcr=(complex *)matrixof(result);
		for (i=0; i<c; i++)
		{	if (i>=c1) { c_copy(*mcr,*mc2); mcr++; mc2++; }
			else if (i>=c2) { c_copy(*mcr,*mc1); mcr++; mc1++; }
			else { c_add(*mc1,*mc2,*mcr); mc1++; mc2++; mcr++; }
		}
	}
	else if (isinterval(hd))
	{	mi1=(interval *)m1; mi2=(interval *)m2;
		result=new_imatrix(1,c,""); if (error) return;
		mir=(interval *)matrixof(result);
		for (i=0; i<c; i++)
		{	if (i>=c1) { i_copy(*mir,*mi2); mir++; mi2++; }
			else if (i>=c2) { i_copy(*mir,*mi1); mir++; mi1++; }
			else { i_add(*mi1,*mi2,*mir); mi1++; mi2++; mir++; }
		}
	}
	else if (isreal(hd))
	{	result=new_matrix(1,c,""); if (error) return;
		mr=matrixof(result);
		for (i=0; i<c; i++)
		{	if (i>=c1) { *mr++ = *m2++; }
			else if (i>=c2) { *mr++ = *m1++; }
			else { *mr++ = *m1++ + *m2++; }
		}
	}
	else wrong_arg();
	moveresult(st,result);
}
Exemple #4
0
void polydiv (header *hd)
{	header *st=hd,*hd1,*result,*rest;
	int c1,c2,i,r,j;
	double *m1,*m2,*mr,*mh,x,l;
	complex *mc1,*mc2,*mcr,*mch,xc,lc,hc;
	interval *mi1,*mi2,*mir,*mih,xi,li,hi;
	hd1=next_param(st);
	equal_params_2(&hd,&hd1); if (error) return;
	getmatrix(hd,&r,&c1,&m1); if (r!=1) wrong_arg();
	getmatrix(hd1,&r,&c2,&m2); if (r!=1) wrong_arg();
	if (c1<c2)
	{	result=new_real(0.0,"");
		rest=(header *)newram;
		moveresult(rest,hd1);
	}
	else if (iscomplex(hd))
	{	mc1=(complex *)m1; mc2=(complex *)m2;
		result=new_cmatrix(1,c1-c2+1,""); if (error) return;
		mcr=(complex *)matrixof(result);
		rest=new_cmatrix(1,c2,""); if (error) return;
		mch=(complex *)newram;
		if (!freeram(c1*sizeof(complex)))
		{	output("Out of memory!\n"); error=190; return;
		}
		memmove((char *)mch,(char *)mc1,c1*sizeof(complex));
		c_copy(lc,mc2[c2-1]);
		if (lc[0]==0.0 && lc[1]==0.0) wrong_arg();
		for (i=c1-c2; i>=0; i--)
		{	c_div(mch[c2+i-1],lc,xc); c_copy(mcr[i],xc);
			for(j=0; j<c2; j++)
			{	c_mult(mc2[j],xc,hc);
				c_sub(mch[i+j],hc,mch[i+j]);
			}
		}
		memmove((char *)matrixof(rest),(char *)mch,c2*sizeof(complex));
	}
	else if (isinterval(hd))
	{	mi1=(interval *)m1; mi2=(interval *)m2;
		result=new_imatrix(1,c1-c2+1,""); if (error) return;
		mir=(interval *)matrixof(result);
		rest=new_imatrix(1,c2,""); if (error) return;
		mih=(complex *)newram;
		if (!freeram(c1*sizeof(complex)))
		{	output("Out of memory!\n"); error=190; return;
		}
		memmove((char *)mih,(char *)mi1,c1*sizeof(interval));
		i_copy(li,mi2[c2-1]);
		if (li[0]<=0.0 && li[1]>=0.0) wrong_arg();
		for (i=c1-c2; i>=0; i--)
		{	i_div(mih[c2+i-1],li,xi); c_copy(mir[i],xi);
			for(j=0; j<c2; j++)
			{	i_mult(mi2[j],xi,hi);
				i_sub(mih[i+j],hi,mih[i+j]);
			}
		}
		memmove((char *)matrixof(rest),(char *)mih,c2*sizeof(interval));
	}
	else if (isreal(hd))
	{	result=new_matrix(1,c1-c2+1,""); if (error) return;
		mr=matrixof(result);
		rest=new_matrix(1,c2,""); if (error) return;
		mh=(double *)newram;
		if (!freeram(c1*sizeof(double)))
		{	output("Out of memory!\n"); error=190; return;
		}
		memmove((char *)mh,(char *)m1,c1*sizeof(double));
		l=m2[c2-1];
		if (l==0.0) wrong_arg();
		for (i=c1-c2; i>=0; i--)
		{	x=mh[c2+i-1]/l; mr[i]=x;
			for(j=0; j<c2; j++) mh[i+j]-=m2[j]*x;
		}
		memmove((char *)matrixof(rest),(char *)mh,c2*sizeof(double));
	}
	else wrong_arg();
	moveresult(st,result);
	moveresult(nextof(st),rest);
}
Exemple #5
0
static void update_evidence_grid(carmen_shape_p contour, int *laser_mask, double resolution, double laser_stdev) {

  double xmin, xmax, ymin, ymax;
  double dx, dy, dmax;
  double *ux, *uy;
  double **mask;
  int i, j, x, y, x0, x1, y0, y1;
  int new_x_size, new_y_size;
  int mask_x_size, mask_y_size, mask_ux, mask_uy;
  int mask_x0, mask_x1, mask_y0, mask_y1;
  int x_offset, y_offset;
  double ltheta;

  printf("update_evidence_grid()\n");

  ux = contour->x;
  uy = contour->y;

  // find bounds for contour's evidence grid
  xmin = xmax = ux[0];
  ymin = ymax = uy[0];
  for (i = 1; i < contour->num_points; i++) {
    if (ux[i] > xmax)
      xmax = ux[i];
    else if (ux[i] < xmin)
      xmin = ux[i];
    if (uy[i] > ymax)
      ymax = uy[i];
    else if (uy[i] < ymin)
      ymin = uy[i];
  }

  // give a buffer for the egrid
  xmin -= 2 * EGRID_MASK_STDEV_MULT * laser_stdev;
  ymin -= 2 * EGRID_MASK_STDEV_MULT * laser_stdev;
  xmax += 2 * EGRID_MASK_STDEV_MULT * laser_stdev;
  ymax += 2 * EGRID_MASK_STDEV_MULT * laser_stdev;

  new_x_size = floor((xmax-xmin) / resolution);
  new_y_size = floor((ymax-ymin) / resolution);

  //egrid_x_offset = -xmin;
  //egrid_y_offset = -ymin;

  if (egrid == NULL) {  // new egrid
    egrid = new_matrix(egrid_x_size, egrid_y_size);
    egrid_counts = new_imatrix(egrid_x_size, egrid_y_size);
    egrid_hits = new_imatrix(egrid_x_size, egrid_y_size);
    for (i = 0; i < egrid_x_size; i++) {
      for (j = 0; j < egrid_y_size; j++) {
	egrid_counts[i][j] = egrid_hits[i][j] = 0;
	egrid[i][j] = -1.0;
      }
    }
    egrid_x_size = new_x_size;
    egrid_y_size = new_y_size;
    egrid_x_offset = -xmin;
    egrid_y_offset = -ymin;
  }
  else {  // resize
    x0 = floor((xmin - egrid_x_offset)/resolution);
    x1 = floor((xmax - egrid_x_offset)/resolution) + 1;
    y0 = floor((ymin - egrid_y_offset)/resolution);
    y1 = floor((ymax - egrid_y_offset)/resolution) + 1;
    if (x0 < 0 || x1 > egrid_x_size || y0 < 0 || y1 > egrid_y_size) {
      x0 = MAX(-x0, 0);
      x1 = MAX(x1, egrid_x_size);
      y0 = MAX(-y0, 0);
      y1 = MAX(y1, egrid_y_size);
      egrid = matrix_resize(egrid, x0, y0, egrid_x_size, egrid_y_size, x0+x1, y0+y1, -1.0);
      egrid_counts = imatrix_resize(egrid_counts, x0, y0, egrid_x_size, egrid_y_size, x0+x1, y0+y1, 0);
      egrid_hits = imatrix_resize(egrid_hits, x0, y0, egrid_x_size, egrid_y_size, x0+x1, y0+y1, 0);
      egrid_x_size = x0 + x1;
      egrid_y_size = y0 + y1;
      egrid_x_offset -= x0*resolution;
      egrid_y_offset -= y0*resolution;
    }
  }

  // trace laser
  for (i = 0; i < laser_msg.num_readings; i++) {
    ltheta = carmen_normalize_theta(laser->theta + (i-90)*M_PI/180.0);
    trace_laser_beam(laser->x, laser->y, ltheta, laser->range[i], laser_mask[i]);
  }

  /***************************** dbug **********************************

  for (i = 0; i < egrid_x_size; i++)
    for (j = 0; j < egrid_y_size; j++)
      egrid[i][j] = LOW_LOG_PROB;

  // create a log prob mask of odd dimensions (so there will be a unique center cell)
  mask_x_size = floor(2 * EGRID_MASK_STDEV_MULT * laser_stdev / resolution);
  if (mask_x_size % 2 == 0)
    mask_x_size++;
  mask_y_size = floor(2 * EGRID_MASK_STDEV_MULT * laser_stdev / resolution);
  if (mask_y_size % 2 == 0)
    mask_y_size++;

  mask_ux = floor(mask_x_size / 2.0);
  mask_uy = floor(mask_y_size / 2.0);

  //printf("mask_size = (%d %d)\n", mask_x_size, mask_y_size);

  mask = new_matrix(mask_x_size, mask_y_size);

  dmax = mask_x_size*mask_x_size*resolution*resolution/4.0;
  for (i = 0; i < mask_x_size; i++) {
    dx = (i - mask_ux) * resolution;
    for (j = 0; j < mask_y_size; j++) {
      dy = (j - mask_uy) * resolution;
      if (dx*dx+dy*dy <= dmax)  // circular mask
	mask[i][j] = -(dx*dx+dy*dy) / (2 * laser_stdev * laser_stdev);
      else
	mask[i][j] = LOW_LOG_PROB;
    }
  }

  for (i = 0; i < contour->num_points; i++) {
    x = floor((ux[i] - xmin) / resolution);
    y = floor((uy[i] - ymin) / resolution);
    if (x < 0 || x >= egrid_x_size || y < 0 || y >= egrid_y_size) {
      carmen_warn("Warning: contour point out of evidence grid bounds in get_evidence_grid()\n");
      continue;
    }
    mask_x0 = MAX(0, x + (mask_ux+1) - mask_x_size);
    mask_x1 = MIN(egrid_x_size - 1, x - mask_ux + mask_x_size);
    mask_y0 = MAX(0, y + (mask_uy+1) - mask_y_size);
    mask_y1 = MIN(egrid_y_size - 1, y - mask_uy + mask_y_size);
    x_offset = mask_ux - x;
    y_offset = mask_uy - y;
    for (x = mask_x0; x < mask_x1; x++)
      for (y = mask_y0; y < mask_y1; y++)
	if (egrid[x][y] < mask[x+x_offset][y+y_offset])
	  egrid[x][y] = mask[x+x_offset][y+y_offset];
  }

  free(mask);

  //*egrid_x_offset = -xmin;
  //*egrid_y_offset = -ymin;
  //*egrid_x_size_ptr = egrid_x_size;
  //*egrid_y_size_ptr = egrid_y_size;

  ***************************** end dbug *****************************/

  return egrid;
}