24小时热门版块排行榜    

查看: 1229  |  回复: 5
本帖产生 1 个 程序强帖 ,点击这里进行查看

dubo

金虫 (著名写手)

优秀版主

[求助] 1000金币求把下面MATLAB代码专为C语言

由于最近比较忙,所以想请以为比较清闲的人帮我把下面的matlab程序转换为C语言版(最好能直接在linux上运行)的。谢谢各位!!

[code/]
clc;clear;  
load rdf.xvg;
T=500;%%The tempture
multi=500;
data=rdf;
x_from=0;
x_to=1.592;
jingdu=0.002;
x_from=floor(x_from/jingdu)*jingdu;
x_to=floor(x_to/jingdu)*jingdu;
x_to_big=3;%%x_to_big  is the data_out big
x=0:jingdu:x_to;
from=1;
to=length(x);
len=size(data(:,2));
len(1,1)=to-len(1,1);
x=x';
kBT=T*8.3145/1000;
dx=-kBT*log(smooth([data(:,2);zeros(len)])+eps);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
dx=smooth(dx);
%% nonbonded tabulate
fx=zeros(size(x));
fx2=zeros(size(x));
hx=zeros(size(x));
hx2=zeros(size(x));
gx=zeros(size(x));
gx2=zeros(size(x));
gx(from:to)=dx(from:to);
gx2=smooth(gx2);
table_non=[x,fx,fx2,gx,gx2,hx,hx2];

%% table up x_to
length_up= (x_to+jingdu):jingdu:x_to_big;
dd_zero=zeros(length(length_up),1);
dd_up=[length_up'  dd_zero  dd_zero  dd_zero  dd_zero  dd_zero  dd_zero];
table_non=[table_non;dd_up];
save('table_CR1_CR1.xvg', 'table_non', '-ASCII');
[/code]
回复此楼

» 本帖@通知

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖


dubo(金币+50): 为什么说,这个代码不够优美啊! 2011-11-12 12:38:57
dubo(金币-49): 操作失误 2011-11-12 12:39:57
ben_ladeng: 专家考核存档 2011-11-12 23:27:09
转了测试了.代码正确完成任务,结果比较了,完全相同,
不过这matlab代码谁写的,不怎么优美
CODE:
#include
#include
#include


// --------------------------
// load data from xvg file
// --------------------------
void loadData(FILE *fid, float data[797][2])
{
        int i=0;
        while(fscanf(fid,"%f %f\n",&data[i][0],&data[i][1])!=EOF)
                i++;
}


// --------------------------
// write back to xvg file
// --------------------------
void saveData(float data[1501][7])
{
        FILE *fout;
        int i,j;
        fout = fopen("table_CR1_CR1.xvg","w");
        if(fout==NULL)
                return;

        for (i=0;i<1501;++i)
        {
                for (j=0;j<7;++j)
                {
                        fprintf(fout,"%f ",data[i][j]);
                }
                fprintf(fout,"\n");
        }
               

        fclose(fout);
}

// --------------------------
// zeros vector
// --------------------------
void zeros(float vec[797])
{
        int i;
        for (i=0;i<797;++i)
                vec[i] = 0.0;
}
// --------------------------
// smooth the array with
// default span 5
// --------------------------
void smooth(float vec[797])
{
        float sum;
        int i,j;
        for (i=0;i<797;++i)
        {
                sum = 0.0;

                if (i<3)
                {
                        for (j=0;j<=i;++j)
                                sum += vec[j];
                        vec[i] = sum/(i+1);
                }
                else if (i>=797-3)
                {
                        for (j=i;j<797;++j)
                                sum += vec[j];
                        vec[i] = sum/(797-i);
                }
                else
                {
                        for (j=i-2;j<=i+2;++j)
                                sum += vec[j];
                        vec[i] = sum/5;
                }
        }
}

// --------------------------
// main entry
// --------------------------
int main(int argc, char *argv[])
{
        FILE *fid;
        float eps = 2.2204e-16;
        float data[797][2], tablenon[1501][7];
        float x[797], dx[797],
                fx[797], fx2[797],
                hx[797], hx2[797],
                gx[797], gx2[797];
        double xfrom = 0.0, xto = 1.592, xtobig = 3.0, jingdu = 0.002, kbt;

        int T = 500, multi = 500, from = 1, to = 797, len = 797;

        int i,j;

        fid = fopen("rdf.xvg","r");
        if(fid==NULL)
                return -1;

        // read to data 797*2
        loadData(fid,data);
        fclose(fid);

        // make x and dx
        for (i=0;i<797;++i)
        {
                x[i] = i*jingdu;
                dx[i] = data[i][1];
        }

        // update dx
        kbt = T*8.3145/1000;
        smooth(dx);
        for (i=0;i<797;++i)
        {
                dx[i] += eps;
                dx[i] = -1*kbt*log(dx[i]);
        }

        // smooth 10 times
        for        (i=0;i<10;++i)
                smooth(dx);

        zeros(fx);
        zeros(fx2);
        zeros(hx);
        zeros(hx2);
        zeros(gx);
        zeros(gx2);
       
        for (i=from;i                 gx2[i] = dx[i];

        smooth(gx2);

        // first 797 row
        for (i=0;i<797;++i)
        {
                tablenon[i][0] = x[i];
                tablenon[i][1] = fx[i];
                tablenon[i][2] = fx2[i];
                tablenon[i][3] = gx[i];
                tablenon[i][4] = gx2[i];
                tablenon[i][5] = hx[i];
                tablenon[i][6] = hx2[i];
        }


        // the rest
        for (i=797;i<1501;++i)
        {
                tablenon[i][0] = xto+(i+1-797)*jingdu;
                for (j=1;j<7;++j)
                        tablenon[i][j] = 0;
        }

        saveData(tablenon);

        system("PAUSE");
        return 0;
}

比较,误差是0
CODE:
>> tt = load('table_CR1_CR1.xvg');
>> size(tt)
ans =
        1501           7
>> tn = table_non;
>> size(table_non)
ans =
        1501           7
>> e = tn-tn;
>> sum(e(:))
ans =
     0
>>  

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
2楼2011-11-11 05:07:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

★ ★
xzhdty(金币+2): 欢迎常来程序语言讨论 2011-11-11 10:48:28
dubo(金币+1000): 100,明天我测试一下给其他的金币,呵呵,辛苦了!!! 2011-11-11 23:33:21
ben_ladeng(程序强帖+1): 专家考核存档 2011-11-12 23:28:11
非常抱歉,看错了gx和gx2,帖子无法修改,重贴了
CODE:
#include
#include
#include


// --------------------------
// load data from xvg file
// --------------------------
void loadData(FILE *fid, float data[797][2])
{
        int i=0;
        while(fscanf(fid,"%f %f\n",&data[i][0],&data[i][1])!=EOF)
                i++;
}


// --------------------------
// write back to xvg file
// --------------------------
void saveData(float data[1501][7])
{
        FILE *fout;
        int i,j;
        fout = fopen("table_CR1_CR1.xvg","w");
        if(fout==NULL)
                return;

        for (i=0;i<1501;++i)
        {
                for (j=0;j<7;++j)
                {
                        fprintf(fout,"%f ",data[i][j]);
                }
                fprintf(fout,"\n");
        }
               

        fclose(fout);
}

// --------------------------
// zeros vector
// --------------------------
void zeros(float vec[797])
{
        int i;
        for (i=0;i<797;++i)
                vec[i] = 0.0;
}
// --------------------------
// smooth the array with
// default span 5
// --------------------------
void smooth(float vec[797])
{
        float sum;
        int i,j;
        for (i=0;i<797;++i)
        {
                sum = 0.0;

                if (i<3)
                {
                        for (j=0;j<=i;++j)
                                sum += vec[j];
                        vec[i] = sum/(i+1);
                }
                else if (i>=797-3)
                {
                        for (j=i;j<797;++j)
                                sum += vec[j];
                        vec[i] = sum/(797-i);
                }
                else
                {
                        for (j=i-2;j<=i+2;++j)
                                sum += vec[j];
                        vec[i] = sum/5;
                }
        }
}

// --------------------------
// main entry
// --------------------------
int main(int argc, char *argv[])
{
        FILE *fid;
        float eps = 2.2204e-16;
        float data[797][2], tablenon[1501][7];
        float x[797], dx[797],
                fx[797], fx2[797],
                hx[797], hx2[797],
                gx[797], gx2[797];
        double xfrom = 0.0, xto = 1.592, xtobig = 3.0, jingdu = 0.002, kbt;

        int T = 500, multi = 500, from = 1, to = 797, len = 797;

        int i,j;

        fid = fopen("rdf.xvg","r");
        if(fid==NULL)
                return -1;

        // read to data 797*2
        loadData(fid,data);
        fclose(fid);

        // make x and dx
        for (i=0;i<797;++i)
        {
                x[i] = i*jingdu;
                dx[i] = data[i][1];
        }

        // update dx
        kbt = T*8.3145/1000;
        smooth(dx);
        for (i=0;i<797;++i)
        {
                dx[i] += eps;
                dx[i] = -1*kbt*log(dx[i]);
        }

        // smooth 10 times
        for        (i=0;i<10;++i)
                smooth(dx);

        zeros(fx);
        zeros(fx2);
        zeros(hx);
        zeros(hx2);
        zeros(gx);
        zeros(gx2);
       
        for (i=0;i<797;++i)
                gx[i] = dx[i];

        smooth(gx2);

        // first 797 row
        for (i=0;i<797;++i)
        {
                tablenon[i][0] = x[i];
                tablenon[i][1] = fx[i];
                tablenon[i][2] = fx2[i];
                tablenon[i][3] = gx[i];
                tablenon[i][4] = gx2[i];
                tablenon[i][5] = hx[i];
                tablenon[i][6] = hx2[i];
        }


        // the rest
        for (i=797;i<1501;++i)
        {
                tablenon[i][0] = xto+(i+1-797)*jingdu;
                for (j=1;j<7;++j)
                        tablenon[i][j] = 0;
        }

        saveData(tablenon);

        system("PAUSE");
        return 0;
}

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-11-11 07:49:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

imyourkobe

铁杆木虫 (著名写手)

【答案】应助回帖


jjdg(金币+1): 感谢参与 2011-11-12 00:42:45
我以前做了一年这样的工作。其实比较容易的。
4楼2011-11-11 18:09:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dubo

金虫 (著名写手)

优秀版主

引用回帖:
3楼: Originally posted by libralibra at 2011-11-11 07:49:13:
非常抱歉,看错了gx和gx2,帖子无法修改,重贴了
[code] #include <stdio.h>
#include <stdlib.h>
#include <math.h>


// --------------------------
// load data from xvg file
// -- ...

金币都给你了啊!你给的代码模块化挺好的,不过有些参量要是能从文件中读入,就更好了!!
5楼2011-11-12 12:42:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军


余泽成(金币+1): 谢谢参与应助! 2011-11-13 21:37:30
引用回帖:
5楼: Originally posted by dubo at 2011-11-12 12:42:30:
金币都给你了啊!你给的代码模块化挺好的,不过有些参量要是能从文件中读入,就更好了!!

如果是c++,动态数组会方便些.
c能不能动态数组我不熟啊
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
6楼2011-11-13 03:24:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dubo 的主题更新
信息提示
请填处理意见