| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1279 人关注过本帖
标题:求各位高手指点,怎样间隔读取
取消只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:30 回复次数:12 
求各位高手指点,怎样间隔读取
TCATAGTAGGCATTCAACGTTCCATCGATTCCTACGTCAGAAAACTCAGCGCAATCCCAATTCGCACGATTGGTTGCGTAGAATTTTGTCAAACGAGGGGAGGTTGTACCTAATGTGCATGGGTCTGTTATACAATTATTTCAATACTCCTTAATCATACAGATTTGGACGAAAAAGCGCGTACGTCCCCTGGTAACAAGTTTCGGGGTTAACATCACCAGATGCATGAAGTTGTCTGGCAGGGCTAGTATTAACGCCGAACAAACTCGTGTGGCCAGTGGCGTTCGGGGCACAGTTTATAAGAGCGGGGAATTAATAAGACCCTTAAATTCTAGGAGTAAGTGTGACAATCCGATCTATGTCC
这是一段碱基序列,当然实际序列要比它长。序列由A、T、C、G四个字符无序组成,现在要测知每种八联体组合(即8个位置,每个位置可有A、T、C、G中的任一个填充,则8个位置共有4^8个八联体组合)在文件(上面已给出)中的出现次数。
注意:假设这一段基因序列为AGCGTACTAG,则如果以1为间隔这段序列里有3个八联体,即第一个字符至第八个字符,第二个字符至第九个字符,第三个字符至第十个字符。
                                      则如果以2为间隔这段序列里有2个八联体,即第一个字符至第八个字符,第3个字符至第10个字符,
                                      则如果以3为间隔这段序列里有1个八联体,即第一个字符至第八个字符.第4个字符至第11个字符为第2个八联体,但上述字符串只有10个字符。
但实际序列很长,而我设置的间隔为k又是个变量,请问这个程序怎么遍呀?
谢谢!!!!

这是好友帮忙的一个程序,但只能以1为间隔,2、3、、、、等不行。
#include <stdio.h>

#define N_A 6
#define N_B (1u<<(2*N_A))

int main()
{
    static unsigned long octamer_count[N_B] = { 0 };    //当跑八模体以上时,因为数据量已经很大,要价个static,八模体以下不用它

    ////// 1 //////
    {
        FILE* file = fopen( "E:\\酵母\\光学与信息学\\碱基随机.txt", "rb" );
        if( !file )
        {
            puts( "cannot open the input file.");
            return 1;
        }
        {
            unsigned long octamer;
            unsigned long octamer_n = 0;
            char c;
            for( ; fread(&c,1,1,file)==1; )
            {
                switch( c )
                {
                    case 'A':
                        octamer = (octamer*4+0)%N_B; ++octamer_n; break;
                    case 'T':
                        octamer = (octamer*4+1)%N_B; ++octamer_n; break;
                    case 'C':
                        octamer = (octamer*4+2)%N_B; ++octamer_n; break;
                    case 'G':
                        octamer = (octamer*4+3)%N_B; ++octamer_n; break;
                    case '\r':
                    case '\n':
                        continue;
                    default:
                        puts( "Fuck" );
                    case 'N':
                        octamer_n = 0;
                        continue;
                }
                if( octamer_n < N_A )
                    continue;
                octamer_n = N_A;

                ++octamer_count[octamer];
            }
        }
        fclose( file );
    }

    ////// 2 //////
    {
        FILE* fileout = fopen( "E:\\酵母\\光学与信息学\\碱基随机19模体.txt", "wt" );
        if( !fileout )
        {
            puts( "cannot open the output file.");
            return 2;
        }
        {
            unsigned int i, j;
            for( i=0; i<sizeof(octamer_count)/sizeof(octamer_count[0]); ++i)
            {
                if( octamer_count[i] == 0 )
                    continue;
                for( j=N_B/4; j!=0; j/=4 )
                    fprintf( fileout, "%c", "ATCG"[i/j%4] );
                fprintf( fileout, "\t%u\n", octamer_count[i] );
            }
        }
        fclose( fileout );
    }

    return 0;
}
2014-04-19 18:58
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
是的,因为我是做信息学的学生,本身又是学物理的,所以计算机这块个别棘手的让我有些难以处理
2014-04-19 20:06
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 5 楼 TonyDeng
随机序列.rar (1.39 MB)

这就是那个文件。
我是统计每个8模体在碱基序列中出现的次数(8模体共有4的8次幂个)
当然还要统计其它k模体在碱基序列中出现的次数(k模体共有4的k次幂个)
2014-04-19 20:31
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 8 楼 TonyDeng
ATCATCAT就指一个八模体。这样的模体有4的8次幂个。
非常感谢你。
因为以前只需以1个碱基为间隔计算8模体个数
这回不行了,需要以k个碱基间隔计算。
非常谢谢!!!
2014-04-19 21:21
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 10 楼 TonyDeng
您好:首先非常感谢您,百忙之中为我编写程序。
我运行了,总是存在如下问题,老是改不好。再麻烦您一下,这该怎么解决?
谢谢!!!

F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(15) : error C2065: 'printf_s' : undeclared identifier
F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(28) : error C2065: 'errno_t' : undeclared identifier
F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(28) : error C2146: syntax error : missing ';' before identifier 'error'
F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(28) : error C2065: 'error' : undeclared identifier
F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(28) : error C2065: 'fopen_s' : undeclared identifier
F:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准\1.cpp(50) : warning C4018: '==' : signed/unsigned mismatch
2014-04-20 13:03
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用TonyDeng在2014-4-20 00:24:35的发言:

用這個程序,測試你1樓說明中的短數據,結果與你描述的吻合,那麽用於你後來的真實數據,也應正確。你那個文件,是625000個八聨體寫成的吧。

你那文件,是5百萬Byte,結尾没有文件結束符,即全部是數據,每8Byte壹個,即可算出是625000個。按照你說的統計規律,其實用數學直接算也可以了。




您好,您理解错了,500万个字符,如果以1为间隔的话,应有4999993个8模体,因为每[i,i+7]区间内的都是一个8模体,i从0开始,直到4999993结束,i是i++形式的。
因为8模体由8个碱基构成,(碱基即A、T、C、G)8个位置有8个碱基,每个位置上碱基有4种选择,这样就有4的8次幂种8模体(即65536种)。
我是要统计4999993个八模体(4999993个8模体由65536种8模体组成)中每种8模体出现了多少次。
2014-04-20 13:14
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用zhou31146001在2014-4-20 13:14:31的发言:





您好,您理解错了,500万个字符,如果以1为间隔的话,应有4999993个8模体,因为每区间内的都是一个8模体,i从0开始,直到4999993结束,i是i++形式的。
因为8模体由8个碱基构成,(碱基即A、T、C、G)8个位置有8个碱基,每个位置上碱基有4种选择,这样就有4的8次幂种8模体(即65536种)。
我是要统计4999993个八模体(4999993个8模体由65536种8模体组成)中每种8模体出现了多少次。




间隔为k是指i+=(k-1)
基因间八模体.rar (77.98 KB)

附件中就是65536种8模体
2014-04-20 13:20
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用xp0213在2014-4-20 16:04:11的发言:

上面的是不是c99的标准。


应该是c99。
请指教!这个程序怎么弄?
2014-04-20 16:12
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用TonyDeng在2014-4-20 19:27:51的发言:

哦~有時間再研究研究,今天開始連著四天不得空兒。反正你這課題都弄了一年,不差那麽點時間。

麻烦您了,谢谢!!!
2014-04-21 10:18
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用TonyDeng在2014-4-21 19:05:21的发言:


沒錯啊,用我的程序,設置間隔為1,結果是4999993啊。


您好,这个程序在我这里有错误,错误如下。
我也不知道哪错了。
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(16) : error C2065: 'printf_s' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'errno_t' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2146: syntax error : missing ';' before identifier 'error'
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'error' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'fopen_s' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(51) : warning C4018: '==' : signed/unsigned mismatch
执行 cl.exe 时出错.

1.obj - 1 error(s), 0 warning(s)
2014-04-21 19:19
快速回复:求各位高手指点,怎样间隔读取
数据加载中...
 
   



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

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