| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 427 人关注过本帖
标题:提取文本中的64*64个最大值,并存入二维矩阵中。麻烦各位指点下,附代码及数 ...
取消只看楼主 加入收藏
晓亮2015
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-5
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:2 
提取文本中的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;
}
搜索更多相关主题的帖子: 记录 最大值 
2013-11-05 11:56
晓亮2015
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-5
收藏
得分:0 
回复 3楼 pink_duo
非常感谢您啊!
能不能留个联系方式
这是我的扣扣:342667580
2013-11-05 20:13
晓亮2015
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-5
收藏
得分:0 
回复 4楼 zhaogay
同样感谢四楼的,不知道这两分怎么给你啊,呵呵
希望留下个联系方式吧
这是我的扣扣:342667580
2013-11-05 20:52
快速回复:提取文本中的64*64个最大值,并存入二维矩阵中。麻烦各位指点下,附代 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017570 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved