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
行优先顺序推广到多维数组,可规定为先排最右的下标。
LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
其中:
①LOC(a11)是开始结点的存放地址(即基地址)
②d为每个元素所占的存储单元数
③由地址计算公式可得,数组中任一元素可通过地址公式在相同时间内存取。即顺序存储的数组是随机存取结构。
将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。也就是说在内存中连续存放一个列的数据,第一列存完后,再开始存第二列。
【例】二维数组Amn的按列优先存储的线性序列为:
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
列优先顺序推广到多维数组,可规定为先排最左的下标。
LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
使用Lapack库的关键注意事项
本文介绍了在C/C++中使用Lapack库时如何正确声明函数,注意返回值类型改为void,并提供了包含头文件的正确方式。还强调了矩阵数组存储方式的区别,Fortran和Matlab采用列优先,C语言采用行优先,这对多维数组操作至关重要。
6310

被折叠的 条评论
为什么被折叠?



