使用Lapack库的一些重要规则

使用Lapack库的关键注意事项
本文介绍了在C/C++中使用Lapack库时如何正确声明函数,注意返回值类型改为void,并提供了包含头文件的正确方式。还强调了矩阵数组存储方式的区别,Fortran和Matlab采用列优先,C语言采用行优先,这对多维数组操作至关重要。

 

1. 如何在C/C++中使用lapack库中的函数:

    通常,应该如下声明需要使用的lapack函数:

extern "C" {
  extern void sgetrf_(int*, int*, float*, int*, int*, int*);
  extern void sgetri_(int*, float*, int*, int*, float*, int*, int*);
  extern void sgetrs_(char*, int*, int*, float*, int*, int*, float*, int*, int*);
  extern void sgesvd_(char*, char*, int*, int*, float*, int*, float*, float*, int*, float*, int*, float*, int*, int*);
  extern void ssyev_(char*, char*, int*, float*, int*, float*, float*, int*, int*);
  extern void dgetrf_(int*, int*, double*, int*, int*, int*);
  extern void dgetri_(int*, double*, int*, int*, double*, int*, int*);
  extern void dgetrs_(char*, int*, int*, double*, int*, int*, double*, int*, int*);
  extern void dgesvd_(char*, char*, int*, int*, double*, int*, double*, double*, int*, double*, int*, double*, int*, int*);
  extern void dsyev_(char*, char*, int*, double*, int*, double*, double*, int*, int*);
  }

注意:声明的时候返回值改为void,跟头文件里函数的返回值类型为int不同;

             使用如下方法包含头文件时,编译时经常发生错误。

extern "C" {
#include "f2c.h"
#include "clapack.h"
#include "blaswrap.h"
  }

 

2.矩阵的数组的存储方式 :


Fortran和matlab语言中的多维数组存储方式为列优先或列主序原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则或行主序,内循环最好是行循环。

1)行优先顺序
     将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。这种是自然的存储方法,跟概念中的矩阵相似。
  【例】二维数组Amn的按行优先存储的线性序列为:
                a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn
        行优先顺序推广到多维数组,可规定为先排最右的下标。

       二维数组Amn地址计算公式(数组存储结构以C语言下标表示)
        LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
      其中:
  ①LOC(a11)是开始结点的存放地址(即基地址)
  ②d为每个元素所占的存储单元数
  ③由地址计算公式可得,数组中任一元素可通过地址公式在相同时间内存取。即顺序存储的数组是随机存取结构。
(2)列优先顺序
     将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。也就是说在内存中连续存放一个列的数据,第一列存完后,再开始存第二列。
  【例】二维数组Amn的按列优先存储的线性序列为:
                 a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
        列优先顺序推广到多维数组,可规定为先排最左的下标。
       二维数组Amn地址计算公式(数组存储结构以C语言下标表示)
          LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
 
在C/C++中使用CLapack中的函数时,必须注意:
 
作为输入的数组,必须按列优先原则存储到一个内存空间,即在内存连续先存矩阵第一列的数据,然后再连续存第二列数据...,只有这样,才能将该内存传递给clapack函数。其实相当于一个转置操作;
clapack函数输出的数组的意义,其数据也是按照列优先原则存放的,及连续内存存放的是矩阵一整列的数据...,也相当于一个转置操作。
 
3.维度顺序:
 
  在Fortran和matlab中,无论指定维度大小,还是指定维度索引,都是先是行,后是列;
  在C/C++及CImg中,无论指定维度大小,还是指定维度索引,都是先是列(宽),后是行(高)。

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值