提取文本中的64*64个最大值,并存入二维矩阵中。麻烦各位指点下,附代码及数据文件!!!
先谢谢各位了!问题描述:
现有一个包含有262144*4个数据的txt文件,我将其读入到一个二维数组rawdata[][]中,现在要找出其中的64*64=4096个数据的最大值(相对所有数据而言较大的那些数据)并记录他们的位置。
现在我是这样来做的:
我将数据读入到一个二维数组rawdata[][]中,然后找到阈值,但是发现当阈值NN为1171时,此时大于或者等于NN的数据有4109个,大于4096.所以我想将这些数据中大于1171的数据的前4096个截取,存入二维数组bb[][]中。但是发现老是出问题。不知道什么原因?
麻烦各位帮忙指点下。修改下代码!谢谢啦!
附代码及数据文件!
// mytest2.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define luint unsigned long int
#define uint unsigned int
#define MM 4109 //此处应该取4096=64*64,但是由于有一些数据在1024*1024矩阵中有重复,使得满足4096的阈值不存在。
#define CC 64*ta+tb
#define MAX 1000
int main(int argc, char* argv[])
{
FILE *fp=fopen("lut15.txt","r");
// FILE *fw;
luint m,n;//原始数据行列数
double **rawdata;
double bb[64][64];
// double **bb;
//临时参数
luint i,j;
char ch;
//-------------------------------------------------------------------------------------------
luint na,nb,ma,mb,ta,tb,k,counter;
luint NN,count;//NN为判断peak的阈值,MM为64*64,count用于在求NN时统计元素个数
// double bb[64][64];//aa中位二维1024*1024的数值,bb中位64*64的peak值:不足的是,内存开销很大
//此处省略了aa[1024][1024],
luint r[4096],c[4096];//c,d中分别为peak在aa中的峰值位置
luint ra,ca;//统计64*64peak的个数
//-------------------------------------------------------------------------------------------
////////////////读入文件中存储的原始数据////////////////
if (fp==NULL)
{
printf("File not existing!");
exit(1);
}
m=0;
n=0;
//统计行数
do
{
ch=fgetc(fp);
if(ch=='\n')//判断总共有多少行,依据是'\n'换行符
m++;
}
while(ch!=EOF);
rewind(fp);
//统计列数
do
{
ch=fgetc(fp);
// printf("%x\n",ch);
if(ch=='\t')//判断每行有多少元素,依据是'\t' '\X09' 制表键
n++;
}
while(ch!='\n');//如果相等,说明一行结束
// while(ch!='\r');//如果相等,说明一行结束:不知此处行间的符号是\n or \r?
n++;
printf("row:%d\ncol:%d\n",m,n);
//生成动态二维数组
rawdata=(double**)malloc(m*sizeof(double*));
for(i=0;i<m;i++)
rawdata[i]=(double*)malloc(n*sizeof(double));
rewind(fp);
//将矩阵数据读入,赋值给二维数组
for(i=0;i<m;i++)
{
for(j=0;j<n-1;j++)//??????????????j<n-1 or j<n
fscanf(fp,"%lf,",&rawdata[i][j]);//将每一行的数据存入到数组的行中,且此处是指针寻址,所以数组元素要取地址
fscanf(fp,"%lf",&rawdata[i][j]);//准备存入下一行,
}
printf("The rawdata is:\n");
/* for(i=0;i<m;i++)//显示矩阵
for(j=0;j<n;j++)
{
printf("%lf ",rawdata[i][j]);
if(j+1==n)
printf("\n");
}
*/
printf("%lf,%lf ",rawdata[1][1],rawdata[262142][1]);//实现将txt中数据复:制到二维数组中:验证是否存入
printf("\n");
fclose(fp);//文件用完还要记得关闭文件,以便释放指针
//*************************************************************************************************/
/*
上面的程序实现的是将txt中的数据存入到二维数组中;
下面的程序代码是求出262144*4个数据中64*64peak以及位置
mytest3.zip
(1.88 MB)
*/
//------------------------------------------------------------------------------------------------//
NN=0;
while(count!=MM)
{
count=0;NN++;
for(na=0;na<262144;na++)
{ for(nb=0;nb<4;nb++)
{if(rawdata[na][nb]>=NN)//二者数据类型不同
count++;
}
}//找到64*64peak的阈值,这是程序的核心之一
}//while结束
printf("%d,%d",NN,count);
printf("\n");
/*
//生成动态二维数组
bb=(double**)malloc(64*sizeof(double*));
for(k=0;k<64;i++)
bb[k]=(double*)malloc(64*sizeof(double));
*/
//采用遍历法,求出大于NN的所有数,并截断取其中的64*64个数据存入二维数组中,可能将较大的数据舍掉了
ra=0;ca=0;counter=0;
for(ma=0;ma<262144;ma++)
{ for(mb=0;mb<4;mb++)
{ if(rawdata[ma][mb]>=NN&&counter<4096)
{counter++;
for(ta=0;ta<64;ta++)
{ for(tb=0;tb<64;tb++)
{
bb[ta][tb]=rawdata[ma][mb];//提取64*64peak,并存入数组中
r[ra]=ma;
c[ca]=mb;//保存peak相应的位置
ra++;ca++;
}
}
}
}
}
printf("%lf,%lf,%lf",bb[0][0],r[0],c[0]);
printf("\n");
//------------------------------------------------------------------------------------------------//
return 0;
}