C语言中复数运算及调用blas,lapack中复数函数进行科学计算
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中复数函数进行科学计算的更多相关文章
- Jsp中如何通过Jsp调用Java类中的方法
Jsp中如何通过Jsp调用Java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:cn.tianaoweb.com; 2.再在包中添加一个类:如 package com; public ...
- java中方法内可以调用同一个类中的方法
在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.
- InvocationHandler中invoke()方法的调用问题
转InvocationHandler中invoke()方法的调用问题 Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandl ...
- 【C语言探索之旅】 第一部分第九课:函数
内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...
- Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。
闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和 ...
- 一些复数运算的C语言实现
很久不写博客了.第一次写博客是在04年,最近的一次还是在大学时,在学校时,甚至还有过自己去买虚拟主机搭WordPress写博客的经历.现在工作时间越长,越发现积累的重要性.那么就从这里开始吧,重新开始 ...
- 如何在c语言中源文件调用另一个源文件的函数
在源文件A1.c中调用A2.c 中的函数有两种方法: 1.在A2.c中有完整的函数定义,在A1.c中添加一下要用到的函数原型(声明)就可以了,例如:在A2.c中:有函数void A2(){...};在 ...
- python语言特点简介 以及在Windows以及Mac中安装以及配置的注意事项
正如前一篇随笔所提到的,python属于解释型语言 python语言有两个特点: 1.胶水语言(历史遗留问题,原来Perl语言作为Unix内置标准件,获得极大追捧,作为竞争者的python一开始是作为 ...
- R语言- 实验报告 - 利用R语言脚本与Java相互调用
一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...
随机推荐
- CentOS IP DNS设置
1.CentOS 修改DNS 修改对应网卡的DNS的配置文件 # vi /etc/resolv.conf 修改以下内容 nameserver 8.8.8.8 #google域名服务器 nameserv ...
- No simulation input file assignm…
QuartusII中仿真时出现No simulation input file assignment specified on simulator page of the settings dialo ...
- HAproxy部署配置
HAproxy部署配置 拓扑图 说明: haproxy服务器IP:172.16.253.200/16 (外网).192.168.29.140/24(内网) 博客服务器组IP:192.168.29.13 ...
- C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
Windows 8.1, Win10之后,通过GetVersion and GetVersionEx 方法获取WIndows操作系统版本号的功能需要添加manifest文件后才能查找到,不然的话会查找 ...
- kill 和killall----杀死进程
1.根据进程ip查看进程名 Liunx中 通过进程名查找进程PID可以通过 pidof [进程名] 来查找. 反过来 ,通过PID查找进程名则没有相关命令.但在linux根目录中,有一个/proc的 ...
- 【HOSTS相关】什么时候使用127.0.0.1
什么时候使用127.0.0.1 在测试环境,如果想知道上线后服务发生异常中断的情况下界面会如何展示,这个时候有2种方式: 第1种是:由开发人员协助,比如后台开发人员在服务器上使这个服务停止,或者由前端 ...
- oracle-使用数据泵对不同用户和不同表空间的数据迁移
oracle-使用数据泵对不同用户和不同表空间的数据迁移 ---------------------------------------------------2013/11/13 expdp和imp ...
- 简单的用js打印乘法口诀表
<script type="text/javascript"> //乘法口诀表 for (var i = 1; i < 10; i++) { for (var j ...
- 禁止将http请求强制转换为https请求
近期遇到一个问题,在谷歌浏览器里发起的http请求都会被转化为https请求,但在safari里面不会被转化,所以暂时只能用Safari浏览器进行调试,后来还查看了为什么http被强制转化为https ...
- web workers工作线程
web worker工作线程是Html5里面提出来的一个新api,对于JavaScript我们的印象是单线程执行,如果运行复杂运算的时候,页面可能就会失去响应,是运行在后台的javascript,独立 ...