我运行最新版本的Windows 10和ubuntu 16.04,8 GB内存。我在两个系统上尝试了不同的编译器 GCC 4.8.4,clang 3.5和VS2010 ,但都没有工作。
这很奇怪! 因为该程序在许多研究文章中都很常用,这表明它有没有bug 。但我尝试过不同的编译器和IDE,这表明它有 bug 。
所以我要求任何人,如果你能正确运行这个问题末尾的mulcross.c
文件,请告诉我你的系统设置,例如你使用的编译器。任何领导都会很感激!
它需要两个输入文件" GEN.PRM" AND" SEED.DAT"要运行从executable file
构建的mulcross.c
,不,multout.3.03.c
所有这些文件都可以从the link获取。
我尝试了 valgrind 工具,这是valgrind打印的内容。但我是程序世界的新手,所以我不知道这些版画的含义。
==180== Memcheck, a memory error detector
==180== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==180== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==180== Command: ./mulcross2
==180== Parent PID: 2
==180==
==180== Invalid write of size 8
==180== at 0x401343: Pollute (mulcross.c:221)
==180== by 0x403197: main (mulcross.c:567)
==180== Address 0x550e958 is 40 bytes inside a block of size 44 alloc'd
==180== at 0x4C2ABE3: malloc (vg_replace_malloc.c:299)
==180== by 0x401237: Pollute (mulcross.c:214)
==180== by 0x403197: main (mulcross.c:567)
==180==
==180== Invalid write of size 8
==180== at 0x401320: Pollute (mulcross.c:221)
==180== by 0x403197: main (mulcross.c:567)
==180== Address 0x550e960 is 4 bytes after a block of size 44 alloc'd
==180== at 0x4C2ABE3: malloc (vg_replace_malloc.c:299)
==180== by 0x401237: Pollute (mulcross.c:214)
==180== by 0x403197: main (mulcross.c:567)
==180==
==180== Invalid read of size 8
==180== at 0x4013C2: Pollute (mulcross.c:224)
==180== by 0x403197: main (mulcross.c:567)
==180== Address 0x550e960 is 4 bytes after a block of size 44 alloc'd
==180== at 0x4C2ABE3: malloc (vg_replace_malloc.c:299)
==180== by 0x401237: Pollute (mulcross.c:214)
==180== by 0x403197: main (mulcross.c:567)
该计划试图找到形状,位置和形状的可靠估计 马哈拉诺比斯的高维距离。的维度和数量 数据点仅受计算机内存的限制。 this is the program
它是一个shell存档。我运行命令" sh file"提取文件。 我建立文件" mulcross.c"通过使用命令" gcc mulcross.c -o mulcross -lm",它创建一个名为" mulcross"的文件,然后我运行" mulcross"文件由" ./ mulcross" ,它读取原始文件" GEN.PRM"和#34; SEED.DAT",不幸的是bash shell给我一个错误
error in ./mulcross: free():invalid next size (normal):0x000000000012f45c0
但是,如果我改变文件" GEN.PRM"中的参数,例如。从" 10 200 0.25 2 1"(原始)到" 2 200 0.25 2 1"(已修改),这意味着只更改代表维度的第一个参数,脚本&#34 ; mulcross"可以正常运行。我发现只有将dimension参数设置为小于3才能正确运行脚本。
以下是mulcross.c
/* MULCROSS.C */ /* 5/3/93 */
/* generate test data sets for outlier and cluster detection */
/* copyright 1993,94,96 by David L. Woodruff and David M. Rocke */
/* 3/9/93 contam some number of sqrt(chi^2(p;0.001)/p) on each dim */
/* converted from gencross to create multiple clusters */
/* independant N(0,1) entries */
/* pollute with with N[PollMean, y] data entries */
/* where y is set to be at the "crossover" point */
/* This software may be freely distributed for non-commercial use */
/* Compilation Notes: */
/* 1. This is a single file C program using only standard libraries */
/* 2. you will need the -lm linker switch on most Unix and related systems */
/* Other Notes: */
/* 1. see the function Give_Info() for usage instructions */
/* 2. see the appendix of the paper */
/* "Idenfication of Outliers in Multivariate Data" */
/* by Rocke and Woodruff for detailed explanations */
/* 3. the program relpart.c can analyze the test data generated */
/* 4. send questions to dlwoodruff@ucdavis.edu; (916)752-0515 */
#include <stdio.h> /* magical incantations */
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#include <assert.h>
#include <memory.h>
#define BANNER "mulcross version 1.00\nCopyright 1993,94,96 by David L. Woodruff and David M. Rocke\n"
#define DATAFILE "MULCROSS.DAT" /* data output file */
#define STATSFILE "MULCROSS.STT" /* statistics */
#define PARMSFILE "GEN.PRM" /* problem parameters */
#define SEEDFILE "SEED.DAT" /* random number seed */
/*----------------------------------------------------------------------------*/
void Give_Info()
{
printf("This program reads parameters from a file named exactly %s\n",PARMSFILE);
printf("It reads a integer random number seed with 1 to 5 digits from %s\n",SEEDFILE);
printf("This seed file is overwritten with a psuedo-random seed by the program\n");
printf("Data is output to %s and statistics to %s\n",DATAFILE, STATSFILE);
printf("The parameters file (%s) should contain P N A D\n",PARMSFILE);
printf("Where P is the dimension, N is the number of points\n");
printf("A is the fraction of bad data and D controls its distance\n");
printf("See Rocke and Woodruff: Identification of Outliers in Multivariate Data\n");
printf("Sample parameters file: 10 100 0.2 2\n");
}
#define ALLCHK(x) if (x == NULL) {printf ("allocation error\n"); assert(x);}
/* global data */
int VectLen; /* number of attributes */
int XCnt; /* number of observations */
int PollCnt; /* number to pollute */
double PollFrac; /* fraction to pollute */
double NumUnits; /* location of polluted means */
int NumClusters; /* number of outliers clusters */
double *X; /* The observations */
#define Xof(i,j) *(X+(i-1)*VectLen+j-1) /* X[i,j] */
int *JBits; /* indicators for J set (squander bits) */
double *XBarJ; /* x bar values for the J set */
#define XBarJof(i) *(XBarJ+i-1) /* XBarJ[i] */
double *XJ; /* data matrix corresp. to J set */
#define XJof(i,j) *(XJ+(i-1)*VectLen+j-1) /* XJ[i,j] */
/* covariance matrix, rectangular space to facilitate GJ inversion */
/* the inverse is going to be in the right half of the C matrix, so */
/* space is not allocated, just a macro to get at the data */
double *C; /* COLUMN MAJOR covariance matrix */
#define Cof(i,j) (*(C+(i-1)+(j-1)*VectLen)) /* C[i,j] */
#define C_1of(i,j) *(C+VectLen*VectLen+(i-1)+(j-1)*VectLen) /* C-1[i,j] */
double *Chol; /* COLUMN MAJOR "left" cholesky factor */
#define Cholof(i,j) (*(Chol+(i-1)+(j-1)*VectLen)) /* Chol[i,j] */
double *SqResiduals; /* squared distances, zero based */
double *XSave; /* scratch space */
# define XSaveof(i,j) *(XSave+(i-1)*VectLen+j-1) /* col major...*/
long seed; /* URan seed */
double Lambda; /* covariance matrix multiplier */
/*----------------------------------------------------------------------------*/
double URan( long *seed)
/*return a uniform 0,1 rv using and returning the seed*/
{
#define c (long)2147483647
do *seed = ((long)16807 * *seed) % c; while (*seed == 0);
return((double)*seed / (double)c);
#undef c
}
/*--------------------------------------------------------------------------*/
double Norm(double mu, double sd, long *z)
/* return a normal deviate with mean mu and std dev sd,
use seed z */
/* just waste a deviate... */
{
double v1,v2,r;
do {
v1 = 2.0 * URan(z) - 1.;
v2 = 2.0 * URan(z) - 1.;
r = v1*v1 + v2*v2;
} while (r >= 1.0);
return(mu + sd * (v1 * sqrt(-2.0 * log(r)/r)));
}
/*---------------------------------------------------------------------------*/
double Chi2_At_Pt001(int v)
/* return the v deg. of freed. 0.001 point of a chi square*/
/* note that in this case 0.001 means just that in Bowker and Liberman
or Bickel and Doksum */
{
switch (v) {
case 1: return(10.8);
case 2: return(13.8);
case 3: return(16.3);
case 4: return(18.5);
case 5: return(20.5);
case 6: return(22.5);
case 7: return(24.3);
case 8: return(26.1);
case 9: return(27.9);
case 10: return(29.6);
case 11: return(31.3);
case 12: return(32.9);
case 13: return(34.5);
case 14: return(36.1);
case 15: return(37.7);
case 16: return(39.3);
case 17: return(40.8);
case 18: return(43.3);
case 19: return(43.8);
case 20: return(45.3);
case 25: return(52.6);
case 50: return(86.7);
case 100: return(149.4);
default: return(v *
pow(1-(double)2/(double)(9*v)+0.6745*sqrt(2./(9.*(double)v)),3));
/* Bowker and Liberman pp 601-602 */
}
}
/*-------------------------------------------------------------------------*/
void Load_Parms()
/* read in the parameters */
{
FILE *f; /* stream record pointer */
if ((f = fopen(PARMSFILE,"r")) == NULL) {
Give_Info();
printf("mulcross could not open paramaters file %s for read\n",PARMSFILE);
exit(1);
}
NumClusters = 0; // to facilitate gencross input files
fscanf(f,"%d %d %lf %lf %d",&VectLen, &XCnt, &PollFrac, &NumUnits, &NumClusters);
fclose(f);
if (!NumClusters) NumClusters = 1;
PollCnt = (int)(PollFrac * (double)XCnt + 0.5);
if (XCnt <= VectLen) {
printf("For vectors of length %d, there must be at least %d points\n",
VectLen, VectLen+1);
exit(1);
}
if (PollCnt > XCnt / 2) {
printf("You have %d data points, so you cannot pollute %d\n",
XCnt, PollCnt);
exit(1);
}
if (PollCnt <=0 ) {
printf("You must have at least one bad point (see PollFrac in %s)\n",
PARMSFILE);
exit(1);
}
if ((f = fopen(SEEDFILE,"r")) == NULL) {
Give_Info();
printf("Could not open seed file %s for read\n",SEEDFILE);
exit(1);
}
Lambda = (1. - PollFrac) * (PollFrac * (double)VectLen - (1. - PollFrac)) /
(PollFrac * ((1.-PollFrac)*(double)VectLen - PollFrac));
if (Lambda < 0.01) {
Lambda = 0.01;
printf("warning: setting lambda to %lf\n",Lambda);
}
fscanf(f,"%ld",&seed);
fclose(f);
}
/*-------------------------------------------------------------------------*/
void Generate_Data()
/* generate the data (see comments at top of file) */
{
int row, col; /* to loop */
for (row = 1; row <= XCnt; row++)
for (col = 1; col <= VectLen; col++)
Xof(row,col) = Norm((double)0.,(double)1.,&seed);
}
/*-------------------------------------------------------------------------*/
void Pollute()
/* find the sample number of the computed sample closest to 0 */
/* no longer write the sample number to the file NEARFILE */
{
int Samp; /* sample number, not zero based */
int i; /* loop index for distance computation */
double PollDist; /* how far out on each dimension */
double *DirVect; /* direction vector */
int SampStart; /* first polluted sample index */
DirVect = malloc((VectLen+1)*sizeof(float)); ALLCHK(DirVect)
PollDist = NumUnits * sqrt(Chi2_At_Pt001(VectLen) / VectLen);
SampStart = XCnt - PollCnt + 1;
for (Samp = SampStart; Samp <=XCnt; Samp++) {
/* make sure you get enough bad points, even if clusters have differing sizes */
if (!((Samp-SampStart) % (PollCnt / NumClusters))) {
for (i=1; i<=VectLen; i++)
if (URan(&seed) > 0.5) DirVect[i] = -1.; else DirVect[i] = 1.;
}
for (i=1; i<=VectLen; i++) {
Xof(Samp, i) = Norm(PollDist*DirVect[i], sqrt(Lambda), &seed);
}
}
}
/*-------------------------------------------------------------------------*/
void Write_Data()
/* output the X Array */
{
FILE *f; /* input file stream record */
int row,col; /* to loop */
if ((f = fopen(DATAFILE,"w")) == NULL) {
Give_Info();
printf("Could not open %s for write\n",DATAFILE);
exit(1);
}
fprintf(f,"%d %d\n",VectLen, XCnt);
for (row = 1; row <= XCnt; row++) {
for (col = 1; col <= VectLen; col++) fprintf(f," %14.11lf",Xof(row,col));
fprintf(f,"\n");
}
fclose(f);
}
/*-------------------------------------------------------------------------*/
void Dump_Data(char *msg)
/* dump the X array */
{
int row, col;
printf("Dump of X data array %s\n",msg);
for (row=1; row<=XCnt; row++) {
for (col=1; col<=VectLen; col++) printf("%7.5lf ",Xof(row,col));
printf("\n");
}
}
/*-------------------------------------------------------------------------*/
void Make_Room()
/* allocate space for global data structures */
{
X = malloc(VectLen*XCnt*sizeof(double)); ALLCHK(X)
JBits = malloc((XCnt)*sizeof(int)); ALLCHK(JBits)
XBarJ = malloc(VectLen*sizeof(double)); ALLCHK(XBarJ)
XJ = malloc((XCnt)*VectLen*sizeof(double)); ALLCHK(XJ)
C = malloc(VectLen*VectLen*2*sizeof(double)); ALLCHK(C)
Chol = malloc(VectLen*VectLen*sizeof(double)); ALLCHK(Chol)
XSave = malloc(VectLen*XCnt*sizeof(double)); ALLCHK(XSave)
SqResiduals = malloc((XCnt)*sizeof(double)); ALLCHK(SqResiduals)
}
/*-------------------------------------------------------------------------*/
void InvertC(double *C, int VectLen, double *Determinant)
/* things are getting a bit hacked up here..... */
/* assume C is VectLen by VectLen */
/* C must have room for another square on the right */
/* do Gauss-Jordon Elimination on C*x(j) = e(j); Strang 29 */
/* see also page 38 (no use exchanging rows since PDS) */
/* keep a running product of the pivots as the determinant of C */
/* (later, try to do something more efficient (e.g. use Symm)) */
/* COLUMN MAJOR arrays, look out... */
/* pivots are left in original C space, result is on ``right'' side */
{
/* "locals" */
int pivotrow, row, col; /* to loop */
double Pivot; /* C[pivotrow, pivotrow] */
double m; /* multiplier */
/* put I in the right half */
for (row=1; row <= VectLen; row++)
for (col = VectLen+1; col <= 2*VectLen; col++)
if (col == row+VectLen) Cof(row,col) = 1.; else Cof(row,col) = 0.;
/* forward elimination */
*Determinant = 1; /* running product */
for (pivotrow = 1; pivotrow < VectLen; pivotrow++) {
if (!Cof(pivotrow,pivotrow)) {
/* printf("zero pivot at row %d, you lose\n",pivotrow); */
*Determinant = 0.;
return;
} else {
/* non-zero pivot in C[row,row] */
Pivot = Cof(pivotrow, pivotrow); /* two uses for pivot */
for (row = pivotrow+1; row <= VectLen; row++) {
m = Cof(row, pivotrow) / Pivot;
for (col = pivotrow; col <= VectLen+pivotrow; col++) { /* assumes no zero pivots shuffles!!!*/
Cof(row,col) = Cof(row,col) - m * Cof(pivotrow,col);
}
}
}
*Determinant = *Determinant * Pivot;
}
*Determinant = *Determinant * Cof(VectLen, VectLen);
if (!*Determinant) {return;}
/* back substitution, pivots are non-zero, so use them */
for (pivotrow = 2; pivotrow <=VectLen; pivotrow++){
Pivot = Cof(pivotrow, pivotrow);
for (row = 1; row < pivotrow; row++) {
if (Cof(row,pivotrow)) {
m = Cof(row,pivotrow) / Pivot;
for (col = pivotrow; col <= VectLen+pivotrow; col++) {
Cof(row,col) = Cof(row,col) - m*Cof(pivotrow, col);
}
}
}
}
/* finally, divide the rows in the inverse by the pivots */
for (row = 1; row <= VectLen; row++)
for (col = VectLen+1; col <= 2*VectLen; col++)
Cof(row, col) = Cof(row,col) / Cof(row,row);
}
/*-------------------------------------------------------------------------*/
void SqrtC(double *C, double *Chol)
/* cholesky factorization */
/* assume C is VectLen by VectLen */
/* do Gauss-Jordon; Strang 241, 29 */
/* see also page 38 (no use exchanging rows since PDS) */
/* we need L root D (not U) for random deviates so transpose */
/* COLUMN MAJOR arrays, look out... */
/* pivots are left in original C space, result is on ``right'' side */
{
/* "locals" */
int pivotrow, row, col; /* to loop */
double Pivot; /* C[pivotrow, pivotrow] */
double m; /* multiplier */
for (row=1; row <= VectLen; row++) for (col=1; col <= VectLen; col++)
Cholof(row,col) = Cof(row,col);
/* forward elimination to produce U and also mult by pivot matrix */
for (pivotrow = 1; pivotrow < VectLen; pivotrow++) {
if (!Cholof(pivotrow,pivotrow)) {
printf("zero pivot at row %d, you lose\n",pivotrow);
exit(1);
} else {
/* non-zero pivot in C[row,row] */
Pivot = Cholof(pivotrow, pivotrow); /* two uses for pivot */
for (row = pivotrow+1; row <= VectLen; row++) {
m = Cholof(row, pivotrow) / Pivot;
for (col = pivotrow+1; col <= VectLen; col++) {
Cholof(row,col) = Cholof(row,col) - m*Cholof(pivotrow,col);
}
}
Cholof(pivotrow, pivotrow) = sqrt(Pivot);
for (col = pivotrow+1; col <=VectLen; col++)
Cholof(pivotrow,col) = Cholof(pivotrow,col) * sqrt(Pivot) / Pivot;
}
}
Cholof(VectLen, VectLen) = sqrt(Cholof(VectLen, VectLen));
/* do the transpose */
/* (have upper, want lower) */
for (row=1; row<=VectLen;row++) {
for (col=row+1; col<=VectLen;col++) {
Cholof(col,row) = Cholof(row,col);
Cholof(row,col) = 0.;
}
}
}
/*---------------------------------------------------------------------------*/
void Standardize_X()
/* transform X so that it has unit mean and covariance I */
/* (ab)use various and sundry global data structures */
/* in other words, call this only early in the program */
/* for now, just throw away the transform vector and matrix */
{
int i,j,k; /* to loop */
double Det; /* to throw away determinant */
for (j = 1; j <= VectLen; j++) {
XBarJof(j) = 0;
for (i = 1; i <= XCnt; i++) XBarJof(j) += Xof(i,j);
XBarJof(j) /= XCnt;
}
for (i = 1; i <= XCnt; i++)
for (j = 1; j <= VectLen; j++) Xof(i,j) -= XBarJof(j);
/* now find the appropriate rotation (sqrt(XXt)^-1) */
/* put XXt into C (but this is XtX in this program... )*/
for (i=1; i<=VectLen; i++) {
for (j=1; j<=VectLen; j++) {
Cof(i,j) = 0;
for (k=1; k<=XCnt; k++) {
Cof(i,j) += Xof(k,i) * Xof(k,j);
}
}
}
InvertC(C, VectLen, &Det);
if (Det <= 0.0) {printf("Unexpected singularity in mulcross\n"); exit(1);}
for (i=1; i<=VectLen;i++) for (j=1; j<=VectLen;j++) Cof(i,j) = C_1of(i,j);
SqrtC(C, Chol);
/* put sqrt times X (or X times sqrtt here) into XSave then move it to X */
/* becuase X here is really Xt */
/* but the sqrt is transposed above .... */
for (i=1; i<=XCnt; i++) {
for (j=1; j<=VectLen; j++) {
XSaveof(i,j) = 0;
for (k=1; k<=VectLen; k++) {
XSaveof(i,j) += Xof(i,k) * Cholof(k,j);
}
}
}
for (i=1; i<=XCnt; i++) for (j=1; j<=VectLen; j++)
Xof(i,j) = XSaveof(i,j) * sqrt((double)(XCnt-1)); /* make C near I (est = I)*/
}
/*-------------------------------------------------------------------------*/
void Form_XJ()
/* put rows in XJ corresponding to the J set indexes */
/* note that the indicator set is zero based; also note row data vectors*/
{
int Xrow, XJrow, col; /* to loop */
XJrow = 1;
for (Xrow = 1; Xrow <= XCnt; Xrow++) {
if (*(JBits+Xrow-1)) {
for (col = 1; col <= VectLen; col++)
XJof(XJrow, col) = Xof(Xrow, col);
/* the row index is in the J set */
XJrow++;
}
}
}
/*-------------------------------------------------------------------------*/
void Compute_XBarJ(const int JCnt)
/* compute XBarJ values (observations are "row" vectors) */
/* JCnt is the size of the sub-sample */
/* very simple */
{
int row, col; /* to loop */
# define XBCOL *(XBarJ+col-1) /* typing aid */
for (col=1; col<=VectLen; col++) {
XBCOL = XJof(1,col);
for (row=2; row<=JCnt; row++) XBCOL += XJof(row,col);
XBCOL = XBCOL / (JCnt);
}
#undef XBCOL
}
/*-------------------------------------------------------------------------*/
void Dump_XBarJ(char *msg)
/* display the estimate of the center */
{
int col; /* to loop */
printf("Dump of Mean for current J set: %s\n",msg);
for (col=1; col <= VectLen; col++) printf(" %E\n", XBarJof(col));
}
/*-------------------------------------------------------------------------*/
void Form_C(const int JCnt)
/* form the covariance matrix for XJ */
/* JCnt is the size of the sub-sample */
{
int i, j; /* current cell in C */
int k; /* to loop through samples */
for (i=1; i<=VectLen; i++) {
for (j=1; j<=i; j++) {
Cof(i,j) = 0;
for (k=1; k<=JCnt; k++) {
Cof(i,j) += (XJof(k,i) - XBarJof(i))
* (XJof(k,j) - XBarJof(j));
}
Cof(i,j) = Cof(i,j) / (double)(JCnt - 1);
}
}
for (i=1; i<=VectLen;i++) for (j=i+1; j<=VectLen;j++) Cof(i,j) = Cof(j,i);
}
/*--------------------------------------------------------------------------*/
void Compute_Distance_Vector()
/* compute a squared distance vector (called SqResiduals) for the current C_1
and sub-sample
*/
{
double rowsum; /* to accumulate rightmost mult first */
int i; /* index into vector being formed */
int row, col; /* indexes for vector matrix mult. */
/* (row and col refer to c-1) */
for (i=1; i<=XCnt; i++) {
*(SqResiduals+i-1) = 0.;
for (row = 1; row <= VectLen; row++) {
rowsum = 0;
for (col = 1; col <= VectLen; col++) {
rowsum += (Xof(i,col) - XBarJof(col)) * C_1of(row,col);
}
*(SqResiduals+i-1) += rowsum * (Xof(i,row) - XBarJof(row));
}
}
}
/*------------------------------------------------------------------*/
void Generate_Permutation(int N, int *p)
/* generate permutation of length N in p */
/* p is zero based, but the permutation is not */
{
int i,j; /* to loop */
int lspot; /* offset in l */
int *FullList; /* unpermuted */
int *l; /* left to be used */
FullList = malloc(N * sizeof(int));
ALLCHK(FullList)
for (i=0; i<N; i++) *(FullList+i) = i+1;
l = malloc(N * sizeof(int));
ALLCHK(l)
memcpy(l, FullList, sizeof(int)*N);
for (i=0; i < N; i++) {
lspot = (int)(URan(&seed) * (N - i));
*(p+i) = *(l+lspot);
for (j=lspot; j<N-i; j++) *(l+j) = *(l+j+1);
}
free(l); free(FullList);
}
/**************************************************************************/
void main()
{
FILE *f; /* to update seed file */
int i,j,k, row, col; /* loop indexes (cannablized code)*/
int *Permutation;
int JCnt; /* number in basis */
double Det; /* to ignore the determinant...*/
printf(BANNER);
Load_Parms();
Make_Room();
Permutation = malloc(XCnt * sizeof(int)); ALLCHK(Permutation)
Generate_Data();
Pollute();
Standardize_X();
JCnt = XCnt-PollCnt;
for (i=0; i<JCnt; i++) *(JBits+i) = 1;
for (i=JCnt; i<XCnt; i++) *(JBits+i) = 0;
Form_XJ();
Compute_XBarJ(JCnt);
Form_C(JCnt);
InvertC(C, VectLen, &Det);
memcpy(XSave, X, XCnt * VectLen * sizeof(double));
/* randomize the rows of X to make X working */
/* column major is a pain....*/
Generate_Permutation(XCnt, Permutation);
for (j=1; j<=XCnt; j++) for (k=1; k<=VectLen; k++)
Xof(j,k) = XSaveof((*(Permutation+j-1)),k);
Compute_Distance_Vector();
Write_Data();
if (!(f=fopen(STATSFILE,"w"))) {
Give_Info();
printf("Could not open %s for write\n",STATSFILE);
exit(1);
}
fprintf(f,BANNER);
fprintf(f,"Robust Mean:\n");
for (col=1; col <= VectLen; col++) fprintf(f," %E\n", XBarJof(col));
fprintf(f,"Robust Mahalonobis distances\n");
for (row=0; row<XCnt; row++)
fprintf(f,"point %4d: %.4E\n", row+1, *(SqResiduals+row));
fclose(f);
if ((f = fopen(SEEDFILE,"w")) == NULL) {
printf("Could not open %s for write\n",SEEDFILE);
exit(1);
}
fprintf(f,"%ld\n",seed);
fclose(f);
printf("done.\n");
printf("Parameters read from %s; seed file, %s, read and updated\n",
PARMSFILE, SEEDFILE);
printf("Data is in %s, statistics are in %s\n",DATAFILE, STATSFILE);
}
这是GEN.PRM
。
10 200 0.25 2 1
这是SEED.DAT
。
1103854129
任何领导都会很感激!
答案 0 :(得分:1)
在第214行,更改单词 浮动 成为 双