C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色。这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计算.

1.C语言中的复数运算。

C语言中若要用的复数,需要包含头文件complex.h,下面看看一些基本的例子

#include <stdio.h>
#include"complex.h" int main()
{
complex a, b, c, d, f;
a = + *I;
b = + *I;
c = a+b;
d = a*b;
f = a/b;
printf("complex a plus b is :%f, %f\n", creal(c), cimag(c));
printf("complex a multiply b is :%f, %f\n", creal(d), cimag(d));
printf("complex a divided b is :%f, %f\n", creal(f), cimag(f)); }

说明:

(1).creal(c), cimag(c)表示分别取复数c的实部和虚部;

(2).complex 默认是complex double 型数据结构,即实部和虚部都是double 型,当然也可以定义complex int型;

  (3).虚数单位是用I来表示

生成可执行文件:

gcc -o test_complex test_complex1

得到的结果如下:

complex a plus b is :4.000000, 6.000000
complex a multiply b is :-5.000000, 10.000000
complex a / b is :0.440000, 0.080000

2.下面讲下如何利用调用blas的复函数来进行科学运算。

在blas,lapack中有三种表示复数的形式:利用C语言中的complex数据类型、结构体以及实部和复部交替存储。下面举例说明:

(1).利用C语言中complex数据类型

#include <stdio.h>
#include"stdlib.h"
#include"complex.h" complex zdotu_(int *, complex *, int *,complex *, int *); int main()
{
complex *bb, *cc, al; int i, j, N, ONE=;
N =; bb = malloc(N *sizeof(complex));
cc = malloc(N *sizeof(complex));
bb[] = +I; bb[]=+I;
cc[] = +I; cc[]=+I;
al= zdotu_(&N, cc, &ONE, bb, &ONE);
printf("al:%f, %f\n", creal(al), cimag(al)); free(bb);
free(cc);
return ;
}

编译并生成可执行文件

gcc -o test_zdot.o -c test_zdot.c
gcc -o test_zdot test_zdot.c -lblas -lgfortran

执行:

./test_zdot

得到结果:

al:0.000000, 4.000000

(2).利用blas中定义的结构体CBLAS_TEST_ZOMPLEX

#include <stdio.h>
#include"stdlib.h"
#include"cblas_test.h" #define zomplex CBLAS_TEST_ZOMPLEX zomplex zdotu_(int *, zomplex *, int *,zomplex *, int *);
int main()
{ zomplex *b, *c , nal;
int i, N, ONE=;
N =;
b = malloc(N *sizeof(zomplex));
c = malloc(N *sizeof(zomplex)); for(i=; i< N; i++)
{
(*(b+i)).real = ;
(*(b+i)).imag = ;
(*(c+i)).real = ;
(*(c+i)).imag = ;
}  nal= zdotu_(&N, b, &ONE, c, &ONE);
printf("nal:%f, %f\n", nal.real, nal.imag); free(b);
free(c);
return ;
}

说明:a. blas中在头文件cblas_test.h定义了结构体CBLAS_TEST_ZOMPLEX,其成员变量分别为:real, imag.

b.由于结构体CBLAS_TEST_ZOMPLEX的书写太长,例子中通过#define zomplex CBLAS_TEST_ZOMPLEX ,用zomplex来取代。

编译和(1)中一样,链接好blas, gfortran库即可,得到结果如下:

nal:0.000000, 4.000000

(3).利用实部和虚部交叉存储

在blas中定义了结构体,其在物理存储空间中,其实部和虚部都是交叉存储的,即存第一个数的实部,再存第一个数的虚部,第二个数的实部,第二个数的虚部...,那么也可以定义数组,交替存储实部和虚部。例子如下:

#include <stdio.h>
#include"stdlib.h"
#include"cblas_test.h" #define zomplex CBLAS_TEST_ZOMPLEX
zomplex zdotu_(int *, double *, int *, double *, int *);
int main()
{ zomplex al;
 double x[], y[];
int i, j, N, ONE=;
N =; x[] = 1.0; x[] = 1.0; x[] = 1.0; x[] = 1.0;
y[] = 1.0; y[] = 1.0; y[] = 1.0; y[] = 1.0;  al= zdotu_(&N, x, &ONE, y, &ONE);
printf("al:%f, %f\n", al.real, al.imag); return ;
}

注意:函数声明如下:

zomplex zdotu_(int *, double *, int *, double *, int *); 

这里函数的形参数据类型为:double,而不是zomplex型了!!!

编译并执行,得到得到结果如下:

nal:0.000000, 4.000000

  根据自己的选用那种方式就需要声明哪种函数,因此在调用blas编程,需要先声明函数,以免出现意想不到的结果(从这三个例子中也可以看出,函数名一样,如果不声明函数的形参的数据类型,那得到的结果可能会有问题)。

调用lapack和blas类似,复数运算也是这三种方式,根据自己的喜好选择。

C语言中复数运算及调用blas,lapack中复数函数进行科学计算的更多相关文章

  1. Jsp中如何通过Jsp调用Java类中的方法

    Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...

  2. java中方法内可以调用同一个类中的方法

    在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.

  3. InvocationHandler中invoke()方法的调用问题

    转InvocationHandler中invoke()方法的调用问题 Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandl ...

  4. 【C语言探索之旅】 第一部分第九课:函数

    内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  5. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

    闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似.  闭包能够 捕获 和 ...

  6. 一些复数运算的C语言实现

    很久不写博客了.第一次写博客是在04年,最近的一次还是在大学时,在学校时,甚至还有过自己去买虚拟主机搭WordPress写博客的经历.现在工作时间越长,越发现积累的重要性.那么就从这里开始吧,重新开始 ...

  7. 如何在c语言中源文件调用另一个源文件的函数

    在源文件A1.c中调用A2.c 中的函数有两种方法: 1.在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:在A2.c中:有函数void A2(){...};在 ...

  8. python语言特点简介 以及在Windows以及Mac中安装以及配置的注意事项

    正如前一篇随笔所提到的,python属于解释型语言 python语言有两个特点: 1.胶水语言(历史遗留问题,原来Perl语言作为Unix内置标准件,获得极大追捧,作为竞争者的python一开始是作为 ...

  9. R语言- 实验报告 - 利用R语言脚本与Java相互调用

    一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...

随机推荐

  1. python爬虫--自动获取seebug的poc

    简单的写了一个爬取www.seebug.org上poc的小玩意儿~ 首先我们进行一定的抓包分析 我们遇到的第一个问题就是seebug需要登录才能进行下载,这个很好处理,只需要抓取返回值200的页面,将 ...

  2. thinkphp实现无限级分类

    普通的方法(采用for和foreach) //显示 foreach($data as $k=>$v){ //str_repeat()函数用于把字符串重复指定的次数 $data[$k]['titl ...

  3. h5 录音

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  4. ECMAScript6-let与const命令详解

    前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...

  5. 001-Mono for android在vs2012中发布设置

    详细讲解 :http://www.cr173.com/html/20099_1.html 这里是快速设置: 1,把Debug换成Release     这里是必须改的   2,点击工具选项   3, ...

  6. MySQL的left,substr,instr截取字符串函数使用实例

         原表:select * from pagereferrer;如下:  如何在这张表中,查询出按 URL分类的信息 ,例如:211.95.60.43:8080算一类信息,并按百分比显示.预期结 ...

  7. Spring Web MVC(二)

    [toc] 五大核心组件 Controller (处理器.控制器) 控制器的概念是MVC设计模式的一部分(确切地说,是MVC中的C).应用程序的行为通常被定义为服务接口, 而控制器使得用户可以访问应用 ...

  8. 【LCT】一步步地解释Link-cut Tree

    简介 Link-cut Tree,简称LCT. 干什么的?它是树链剖分的升级版,可以看做是动态的树剖. 树剖专攻静态树问题:LCT专攻动态树问题,因为此时的树剖面对动态树问题已经无能为力了(动态树问题 ...

  9. JDK安装图解

    JDK安装部分.. ---------- 此处是一个JDK下载链接:http://www.cr173.com/soft/14290.html 首先是解压下载的JDK安装包.然后右键以管理员身份运行. ...

  10. 关于php中的include html文件的问题,为什么html可以在php中执行

    之前在w3shXXl看的教程,上面对include的解释是把指定的文件复制到这条指令执行的地方. 这真是坑到我了..... 在了解mvc的时候,控制器显示视图时需要用include包含html视图文件 ...