| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 427 人关注过本帖
标题:提取文本中的64*64个最大值,并存入二维矩阵中。麻烦各位指点下,附代码及数 ...
只看楼主 加入收藏
晓亮2015
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-5
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:5 
提取文本中的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
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:6 
希望可以帮到你,如果有错误的地方,希望给我反馈,程序运行慢,耐心等等
第一,while循环条件有问题,//找到64*64peak的阈值,这是程序的核心之一
第二,存储有问题,//采用遍历法,求出大于NN的所有数,并截断取其中的64*64个数据存入二维数组中,可能将较大的数据舍掉了
第三,建议for循环,短循环放外层,常循环放内层;释放内存,变量初始化;


NN=0;
count = 1;
while(count)
{
    count = 0;
    NN++;
    for(nb=0;nb<4;nb++)   
        {    for(na=0;na<262144;na++)
            {if(rawdata[na][nb]>=NN)//二者数据类型不同
                count++;
            }   
        }//找到64*64peak的阈值,这是程序的核心之一
    if ( count <= MM)
    {
        break;
    }

}//while结束


//采用遍历法,求出大于NN的所有数,并截断取其中的64*64个数据存入二维数组中,可能将较大的数据舍掉了
ra=0;ca=0;counter=0;
ta = 0;
tb = 0;
for(mb=0;mb<4;mb++)
    {    for(ma=0;ma<262144;ma++)
        {    if(rawdata[ma][mb]>=NN&&counter<4096)
            {
                counter++;
                bb[ta][tb]=rawdata[ma][mb];//提取64*64peak,并存入数组中
                tb++;
                if ( tb > 63 )
                {
                    ta++;
                    tb = 0;
                }               
                r[ra]=ma;
                c[ca]=mb;//保存peak相应的位置
                ra++;
                ca++;
            }
            
        }
    }
    printf("%lf,%lf,%lf",bb[0][0],r[0],c[0]);
    printf("\n");
//------------------------------------------------------------------------------------------------//
   
    free(rawdata);




埋头做牛,抬头做人,低头做狗
2013-11-05 14:13
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:1 
sorry,后面的打印输出
printf("%lf,%lu,%lu",bb[0][0],r[0],c[0]);
    printf("\n");
//------------------------------------------------------------------------------------------------//
   
    free(rawdata);
    return 0;

[ 本帖最后由 pink_duo 于 2013-11-5 14:42 编辑 ]

埋头做牛,抬头做人,低头做狗
2013-11-05 14:40
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:3 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define luint unsigned long int
#define uint unsigned int
#define MM 4096

int main(int argc, char* argv[])
{
    FILE *fp;
    luint m=0, n=1;
    double **rawdata;
    double bb[64][64];
    char str[520], ch;
    luint na,nb,ma,mb,counter;
    luint NN=0,count, i, j;
    luint r[4096],c[4096];
    luint ra, ca;

    fp = fopen("lut15.txt", "r");
    if (fp == NULL){
        printf("File not existing!");
        exit(1);
    }
    while (fgets(str,sizeof(str),fp) != NULL)
        m++;
    rewind(fp);
    while( (ch=fgetc(fp)) != '\n')
        if(ch=='\t')
            n++;
    printf("row:%lu\ncol:%lu\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;j++)
            fscanf(fp,"%lf,",&rawdata[i][j]);

    printf("The rawdata is:\n");

    printf("%lf,%lf\n",rawdata[1][1],rawdata[m-2][1]);
    fclose(fp);
    while (count > MM) {
        count = 0, NN++;
        for (na=0;na<m;na++)
                for (nb=0;nb<n;nb++)
                    if (rawdata[na][nb] >= NN)
                        count++;
    }//while结束
    printf("%lu,%lu\n",NN,count);
    ra=0, ca=0, counter=0;
    for (ma=0;ma<m;ma++)
        for (mb=0;mb<n;mb++)
            if (rawdata[ma][mb]>=NN) {
                bb[counter/64][counter%64] = rawdata[ma][mb];
                r[ra++] = ma;
                c[ca++] = mb;
                if (counter++ == 4096)
                    goto end;
            }

end:
    printf("%lf,%lu,%lu\n",bb[0][0],r[0],c[0]);
    free(rawdata);

    return 0;
}
,2楼正解,自己也改了下楼主的,记得留两分,不胜感激

好好学习,天天想上
2013-11-05 16:09
晓亮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.034227 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved