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. [补档][Jxoi2012] 奇怪的道路

    [Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...

  2. Spring Boot整合Dubbo使用及开发笔记

    一.概述: Spring Dubbo是我开发的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可以学习 ...

  3. 我的Chrome

    插件: CaretTab - New Tab Clock and Date 完全就是为了好看

  4. sqlite 的基本使用1

    mac 下自带的sqlite3 直接在终端键入 sqlite3 即进入 sqlite的交互界面 1,创建数据库 sqlite3 命令 被用来创建新的数据库 比如sqlite3 mydb,即创建了一个m ...

  5. co源码解析

    一.co函数是什么 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行.短小精悍只有短短200余行,就可以免去手动编写G ...

  6. MATLAB中绘制图形的时候,坐标和标题倒置

    1.如上图所示,直方图的坐标轴以及标题文字都颠倒了 原因: 在MATLAB显示的subplot函数中,图像与直方图这些不属于一类,所以在显示的时候会出现这种情况 解决办法:1>将图像与直方图分开 ...

  7. Jenkins : 邮件通知

    目录 全局配置 为项目添加邮件通知 邮件模板 Pipeline 支持 总结 Jenkins 内置了 Mailer 插件用于发送邮件通知,但是 Mailer 插件的功能比较简单,无法按照用户的需求进行邮 ...

  8. webService接口交互

    1.需要在XXXXX.wsdl中配置相应的类与service方法. 2.启动你的项目,打开浏览器,输入地址:http://localhost:8080/lis/services,就能看到你XXXXX. ...

  9. Wdatepicker日期控件的使用指南 (转)

    Wdatepicker日期控件的使用指南 标签: inputclass语言functionstring正则表达式 2012-02-10 15:48 40826人阅读 评论(5) 收藏 举报 .embo ...

  10. Tomcat8安装及配置教程

    Apache  Tomcat8.0安装及配置教程.. Apache  Tomcat8.0官方网站链接:http://tomcat.apache.org/ apache-tomcat-8.0.39-wi ...