XLPack 5.2 API の使用法

XLPack APIとは

XLPack API (C/C++インターフェース)はXLPackの数値計算モジュールをExcel以外のプログラムから使用するためのインターフェースです. これを使うと以下のことができます.

  • XLPack(あるいは XLPack Lite)が使用している数値計算モジュールをC/C++プログラムから呼び出すことができる
  • Cプログラムを呼び出すことができるその他の言語(Python, C#, F#など)からも呼び出すことができる
  • XLPack APIを使用して作成したプログラムはXLPack(あるいは XLPack Lite)をインストールしたパソコンで実行することができる

また, XLPack API用LAPACKE/CBLASライブラリが提供されます.

ご注意

XLPack APIはXLPackの内部インターフェースをありのまま公開するもので, すべての条件下でテストされたものではありません. 従って, これらの機能, 動作, 信頼性等を保証するものではありません. また, 予告なく仕様変更されることがあります.

ソフトウェアのダウンロード

関連ソフトウェア(XLPack SDK)は ダウンロードページ より入手できます

XLPack API リファレンスマニュアル

C/C++関数 リファレンスマニュアル (別タブで開きます)
C/C++関数 リファレンスマニュアル (XLPack Lite用) (別タブで開きます)

XLPack API の使用法

C/C++からXLPack関数を呼び出す例

例題

次の連立一次方程式を解く.

  Ax = b
              ( 10  -7   0 )       (  0 )       ( 7 )
  ただし, A = ( -3   2   6 ),  x = ( -1 ),  b = ( 4 )
              (  5  -1   5 )       (  1 )       ( 6 )

Cプログラム例(Visual C)

#include <stdio.h>
#include "cnumlib.h"

int main(void)
{
    double a[9] = { 10.0, -3.0, 5.0, -7.0, 2.0, -1.0, 0.0, 6.0, 5.0 };
    double b[3] = { 7.0, 4.0, 6.0 };
    int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], info;

    dgesv(n, nrhs, lda, a, ipiv, ldb, b, &info);
    printf("info = %d\n", info);
    printf("x = %f  %f  %f\n", b[0], b[1], b[2]);
    return 0;
}

実行結果

info = 0
x = 0.000000  -1.000000  1.000000

使用するヘッダーファイルは cnumlib.h (XLPack Liteでは cnumlib_lite.h). リンクするライブラリは XLPack.lib (32ビット版では XLPack_32.lib), または XLPack Liteの場合, XLPack_Lite.lib (32ビット版では XLPack_Lite_32.lib)となります. 行列は列優先(VBAやFortranと同じ)で格納します.

Cプログラム例(Clang)

#include <stdio.h>
#include "cnumlib.h"

int main(void)
{
    double a[3][3], b[3];
    int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[10], info;

    a[0][0] = 10.0; a[1][0] = -7.0; a[2][0] = 0.0;
    a[0][1] = -3.0; a[1][1] = 2.0;  a[2][1] = 6.0;
    a[0][2] = 5.0;  a[1][2] = -1.0; a[2][2] = 5.0;
    b[0] = 7.0;
    b[1] = 4.0;
    b[2] = 6.0;

    dgesv(n, nrhs, lda, a, ipiv, ldb, (double (*)[ldb])b, &info);
    printf("info = %d\n", info);
    printf("x = %f  %f  %f\n", b[0], b[1], b[2]);
    return 0;
}

C99をサポートするClang(Windows版 LLVM Clang や macOS Xcode)の場合には可変長2次元配列を使用します.

– リファレンスマニュアルではClangの表記(可変長2次元配列)になっています. Visual Cの場合には1次元配列に読み替えてください.

C++から使用する場合

ヘッダーファイルは cnumlib (XLPack Liteでは cnumlib_lite) を使うことができます. 行列はClangの場合でも一次元配列に入れます.

複素数の使い方

マニュアルでは, 複素数は doublecomplex という型で表記されていますが, 実際にはVisual Cでは _Dcomplex, Clangでは double _Complex, C++では complex<double> を使います. Visual Cでは複素数の演算子がサポートされていないので, それを補うために分類A4の関数が用意されています. C++からは複素数を関数値として返す関数は使えません (例えば, zdotu, cgamなど). これらについては代替としてサブルーチン版 (例えば, zdotu_sub, cgam_subなど) が用意されています.

例題

次の連立一次方程式を解く.

  Ax = b
                (  1.66+0.6i   0.44-0.11i    0.82-0.56i )       (  0.59-0.28i )       (  0.9774-0.6426i )
    ただし, A = (  0.47+i      1.23-0.47i   -1.72+0.07i ),  x = ( -0.20-0.04i ),  b = ( -0.0860+1.3628i )
                ( -1.32-0.61i  1.42-0.4i     1.62+0.41i )       (  0.24-0.49i )       ( -0.6599-0.6625i )

Cプログラム例(Visual C)

#include <stdio.h>
#include <complex.h>
#include "cnumlib.h"

int main(void)
{
    _Dcomplex a[9] = {
        cmplx(1.66, 0.6), cmplx(0.47, 1.0), cmplx(-1.32, -0.61),
        cmplx(0.44, -0.11), cmplx(1.23, -0.47), cmplx(1.42, -0.4),
        cmplx(0.82, -0.56), cmplx(-1.72, 0.07), cmplx(1.62, 0.41) };
    _Dcomplex b[3] = {
        cmplx(0.9774, -0.6426), cmplx(-0.086, 1.3628), cmplx(-0.6599, -0.6625) };
    int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], info;

    zgesv(n, nrhs, lda, a, ipiv, ldb, b, &info);
    printf("info = %d\n", info);
    printf("x = ");
    printf("(%f, %f) ", creal(b[0]), cimag(b[0]));
    printf("(%f, %f) ", creal(b[1]), cimag(b[1]));
    printf("(%f, %f)\n", creal(b[2]), cimag(b[2]));
    return 0;
}

実行結果

info = 0
x = (0.590000, -0.280000) (-0.200000, -0.040000) (0.240000, -0.490000)

C++プログラム例

#include <iostream>
#include <complex>
#include "cnumlib"

using namespace std;

int main(void)
{
    complex<double> a[3][3], b[3], i(0.0, 1.0);
    int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], info;

    a[0][0] = 1.66+0.6*i;   a[1][0] = 0.44-0.11*i; a[2][0] = 0.82-0.56*i;
    a[0][1] = 0.47+i;       a[1][1] = 1.23-0.47*i; a[2][1] = -1.72+0.07*i;
    a[0][2] = -1.32-0.61*i; a[1][2] = 1.42-0.4*i;  a[2][2] = 1.62+0.41*i;
    b[0] = 0.9774-0.6426*i;
    b[1] = -0.086+1.3628*i;
    b[2] = -0.6599-0.6625*i;

    zgesv(n, nrhs, lda, (complex<double> *)a, ipiv, ldb, b, info);
    cout << "info = " << info << endl;
    cout << "x = " << b[0] << " " << b[1]  << " "  << b[2] << endl;
    return 0;
}

実行結果

info = 0
x = (0.59,-0.28) (-0.2,-0.04) (0.24,-0.49)
その他の言語からXLPack関数を呼び出す例

C/C++以外の言語からの呼び出し

XLPack APIを使ってXLPack(あるいは XLPack Lite)が使用している数値計算関数モジュールをC/C++プログラムから呼び出すことができますが, Cプログラムを呼び出す機能があればその他の言語からでも呼び出すことができます.

代表的な言語(Python, C#, F#, VB.NET, Delphi(Pascal))について, XLPack SDKにXLPack Liteの全関数の使用例が入っているので参考にしてください. ここではそれぞれの言語の簡単なプログラム例を抜き出して見てみます.

例題

次の連立一次方程式を解く.

  Ax = b
              ( 10  -7   0 )       (  0 )       ( 7 )
  ただし, A = ( -3   2   6 ),  x = ( -1 ),  b = ( 4 )
              (  5  -1   5 )       (  1 )       ( 6 )

それぞれの使用例は例題プログラム部分とインターフェース部分(XLPackにインターフェースするのに必要な全てのコードをまとめたもの)に分けて記述してあります. インターフェース部分に必要なライブラリに関する情報は最後にまとめてあります.

Pythonプログラム例

PythonからC関数を呼び出す方法はいくつかありますが, ここではctypesを使っています. また, 行列をnumpy.arrayで表しています.

import numpy as np
from XLPack import *

def TestDgesv():
    n = 3
    nrhs = 1
    a = np.array([
        [10.0, -3.0, 5.0],
        [-7.0, 2.0, -1.0],
        [0.0, 6.0, 5.0]])
    b = np.array([7.0, 4.0, 6.0])
    ipiv = np.empty(n)
    info = Dgesv(n, nrhs, a, ipiv, b)
    print(b, info)

# -----------------

TestDgesv()

インターフェース部分

from ctypes import *

dll1 = CDLL("XLPackLite.dll")

def Dgesv(n, nrhs, a, ipiv, b):
    dll1.dgesv.argtype = [c_int, c_int, c_int, POINTER(c_double), POINTER(c_int), c_int, POINTER(c_double),
        POINTER(c_int)]
    if a.ndim <= 1:
        lda = n
    else:
        lda = a.shape[1]
    ldb = b.shape[0]
    info = c_int()
    dll1.dgesv(c_int(n), c_int(nrhs), c_int(lda), a.ctypes.data_as(POINTER(c_double)),
        ipiv.ctypes.data_as(POINTER(c_int)), c_int(ldb), b.ctypes.data_as(POINTER(c_double)), byref(info))
    return info.value

. . . 

実行結果

[ 0. -1.  1.] 0

C#プログラム例

using System;
using System.IO;
using static XLPack;

public class Test
{

static void Test_dgesv()
{
    double[] a = new double[9], b = new double[3];
    int[] ipiv = new int[3];
    int n, nrhs, lda, ldb, info;

    n = 3; nrhs = 1; lda = 3; ldb = 3;
    a[0] = 10.0; a[3] = -7.0; a[6] = 0.0;
    a[1] = -3.0; a[4] = 2.0; a[7] = 6.0;
    a[2] = 5.0; a[5] = -1.0; a[8] = 5.0;
    b[0] = 7.0; b[1] = 4.0; b[2] = 6.0;

    dgesv(n, nrhs, lda, a, ipiv, ldb, b, out info);
    Console.Write("info = {0}\n", info);
    Console.Write("x = {0}  {1}  {2}\n", b[0], b[1], b[2]);
}

public static int Main(string[] args)
{
    Test_dgesv();
    return 0;
}

}

インターフェース部分

using System.Runtime.InteropServices;

public static class XLPack
{
    const string DLL1 = "XLPackLite.dll";

    [DllImport(DLL1, CallingConvention = CallingConvention.Cdecl)]
    public extern static void dgesv(int n, int nrhs, int lda, double[] a, int[] ipiv, int ldb, double[] b, out int info);

    . . .

}

実行結果

info = 0
x = 0  -1  1

F#プログラム例

open XLPack.F

module TestDgesv =

    let n = 3
    let nrhs = 1
    let lda = 3
    let a = [| 10.0; -3.0; 5.0; -7.0; 2.0; -1.0; 0.0; 6.0; 5.0 |]
    let ldb = 3
    let b = [| 7.0; 4.0; 6.0 |]
    let ipiv = Array.create n 0
    let mutable info = 0
    dgesv(n, nrhs, lda, a, ipiv, ldb, b, &info)
    printfn "info = %d" info
    printfn "x = %A" b

インターフェース部分

namespace XLPack

module F =

    open System.Runtime.InteropServices

    [<Literal>]
    let Dll1 = "XLPackLite.dll"

    [<DllImport(Dll1, CallingConvention = CallingConvention.Cdecl, EntryPoint="dgesv")>]
    extern void dgesv(int n, int nrhs, int lda, double[] a, int[] ipiv, int ldb, double[] b, int& info)

    . . .

実行結果

info = 0
x = [|0.0; -1.0; 1.0|]

VB.NETプログラム例

Imports XLPack

Class Test

Shared Sub TestDgesv
	Dim A(8) As Double, LdA As Integer, B(2) As Double, LdB As Integer
	Dim IPiv(2) As Integer
	Dim N As Integer, Info As Integer

	N = 3: LdA = 3: LdB = 3
	A(0) = 10.0: A(3) = -7.0: A(6) = 0.0
	A(1) = -3.0: A(4) = 2.0: A(7) = 6.0
	A(2) = 5.0: A(5) = -1.0: A(8) = 5.0
	B(0) = 7.0: B(1) = 4.0: B(2) = 6.0

	Call Dgesv(N, LdA, A, IPiv, LdB, B, Info)
	Console.WriteLine("Info = {0}", Info)
	Console.WriteLine("X = {0}  {1}  {2}", B(0), B(1), B(2))
End Sub

Public Shared Sub Main(ByVal args() As String)
	Call TestDgesv
End Sub

End Class

インターフェース部分

Imports System.Runtime.InteropServices

Class XLPack

    Const DLL1 = "XLPackLite.dll"

    <DllImport(DLL1, CallingConvention:=CallingConvention.Cdecl, EntryPoint:="dgesv")>
    Private Shared Sub XL_dgesv(N As Integer, Nrhs As Integer, LdA As Integer, A() As Double, IPiv() As Integer, LdB As Integer, B() As Double, ByRef Info As Integer)
    End Sub

    Public Shared Sub Dgesv(N As Integer, LdA As Integer, A() As Double, IPiv() As Integer, LdB As Integer, B() As Double, ByRef Info As Integer, Optional Nrhs As Integer = 1)
        Call XL_dgesv(N, Nrhs, LdA, A, IPiv, LdB, B, Info)
    End Sub

    . . .

End Class

実行結果

info = 0
x = 0  -1  1

Delphi(Pascal)プログラム例

program test_xlpack;

uses XLPack;

procedure test_dgesv;
var
    a: array[1..9] of Double; b: array[1..3] of Double;
    n, nrhs, lda, ldb: Integer;
    ipiv: array[1..3] of Integer;
    info: Integer;
begin
    n := 3; nrhs := 1; lda := 3; ldb := 3;
    a[1] := 10.0; a[4] := -7.0; a[7] := 0.0;
    a[2] := -3.0; a[5] := 2.0; a[8] := 6.0;
    a[3] := 5.0; a[6] := -1.0; a[9] := 5.0;
    b[1] := 7.0; b[2] := 4.0; b[3] := 6.0;
    Dgesv(n, nrhs, lda, a, ipiv, ldb, b, info);
    Writeln('info = ', info);
    Writeln('x =');
    Writeln(b[1], '  ', b[2], '  ', b[3]);
end;

begin
    test_dgesv;
end.

インターフェース部分

unit XLPack;

interface

const
    dll1 = 'XLPackLite.dll';

procedure Dgesv(n, nrhs, lda: Integer; var a: array of Double; var ipiv: array of Integer; ldb: Integer;
    var b: array of Double; var info: Integer);

{****************}

implementation

procedure XL_Dgesv(n, nrhs, lda: Integer; var a: Double; var ipiv: Integer; ldb: Integer; var b: Double;
    var info: Integer); cdecl; external dll1 name 'dgesv';

procedure Dgesv(n, nrhs, lda: Integer; var a: array of Double; var ipiv: array of Integer; ldb: Integer;
    var b: array of Double; var info: Integer);
begin
    XL_Dgesv(n, nrhs, lda, a[0], ipiv[0], ldb, b[0], info);
end;

end.

実行結果

info = 0
x =
 0.00000000000000E+0000  -1.00000000000000E+0000   1.00000000000000E+0000

ライブラリモジュール

XLPackの数値計算関数を使用するためには適切なライブラリモジュールを呼び出す必要があります. 使用するライブラリは次のとおりです. 呼び出し規約はcdeclです. エントリー名とパラメータはリファレンスマニュアルに記載されている各ルーチンの詳細を参照してください.

呼び出す関数 OS ビット数 使用されるライブラリモジュール
XLPackモジュール1関数 Windows 64ビット XLPack1.dll
XLPackモジュール2関数 Windows 64ビット XLPack2.dll
XLPackモジュール3関数 Windows 64ビット XLPack3.dll
XLPackモジュール4関数 Windows 64ビット XLPack4.dll
XLPackモジュール1~4共通関数 Windows 64ビット XLPack0.dll
XLPack Lite 関数 Windows 64ビット XLPackLite.dll
XLPackモジュール1関数 Windows 32ビット XLPack1_32.dll
XLPackモジュール2関数 Windows 32ビット XLPack2_32.dll
XLPackモジュール3関数 Windows 32ビット XLPack3_32.dll
XLPackモジュール4関数 Windows 32ビット XLPack4_32.dll
XLPackモジュール1~4共通関数 Windows 32ビット XLPack0_32.dll
XLPack Lite 関数 Windows 32ビット XLPackLite_32.dll
XLPackモジュール1関数 macOS 64ビット XLPack1.dylib
XLPackモジュール2関数 macOS 64ビット XLPack2.dylib
XLPackモジュール3関数 macOS 64ビット XLPack3.dylib
XLPackモジュール4関数 macOS 64ビット XLPack4.dylib
XLPackモジュール1~4共通関数 macOS 64ビット XLPack0.dylib
XLPack Lite 関数 macOS 64ビット XLPackLite.dylib
LAPACKE/CBLASの使い方

XLPack SDKには, XLPack API用のLAPACKE/CBLASライブラリが添付されています.

LAPACKE/CBLASは, Fortranで作成されたLAPACK/BLASをC/C++から直接呼び出せるようにするためのインターフェース変換プログラムで, C/C++言語版LAPACK/BLASともいえるものです. Fortran版との主な違いは次のようになります.

  • 名前の頭に LAPACKE_ あるいは cblas_ というプレフィックスがつく
  • 一時的な作業領域を内部で自動的に確保する (Fortran版と同じように外部から与えるものも用意されており, その場合には名前の後ろに _work というサフィックスがつく)
  • 2次元配列の格納順を(行優先か列優先か)指定することができる. 行優先を指定するとC/C++本来の格納順で使うことができるので便利であるが, 内部的には計算の前後に配列を転置コピーして処理しているので大きな行列の場合にはオーバーヘッドが大きくなるかもしれない

Cインターフェースライブラリに加えて Lapacke.lib (32ビット版では Lapacke_32.lib) をリンクすることにより使用できます. ヘッダーファイルは lapacke.h と cblas.h です. なお, XLPack Liteでは Lapacke_Lite.lib (Lapacke_Lite_32.lib) および lapacke_lite.h を使用することができます.

XLPackに含まれているLAPACKおよびBLAS関数に対応するLAPACKEおよびCBLAS関数がサポートされます.

サポートされるLAPACKE/CBLAS関数の一覧

(*)はXLPack Liteで使用できるものを示します.

cblas_drotg cblas_drotmg cblas_drot cblas_drotm cblas_dswap cblas_dscal
cblas_dcopy cblas_daxpy cblas_ddot cblas_dsdot cblas_dnrm2 cblas_dasum
cblas_idamax
cblas_dgemv cblas_dgbmv cblas_dger cblas_dsbmv cblas_dspmv cblas_dspr
cblas_dspr2 cblas_dsymv cblas_dsyr cblas_dsyr2 cblas_dtbmv cblas_dtbsv
cblas_dtpmv cblas_dtpsv cblas_dtrmv cblas_dtrsv
cblas_dgemm cblas_dsymm cblas_dsyrk cblas_dsyr2k cblas_dtrmm cblas_dtrsm

cblas_zswap cblas_zscal cblas_zdscal cblas_zcopy cblas_zaxpy cblas_zdotu_sub
cblas_zdotc_sub cblas_dznrm2 cblas_dzasum cblas_izamax
cblas_zgemv cblas_zgbmv cblas_zhemv cblas_zhbmv cblas_zhpmv cblas_ztrmv
cblas_ztbmv cblas_ztpmv cblas_ztrsv cblas_ztbsv cblas_ztpsv cblas_zgeru
cblas_zgerc cblas_zher cblas_zher2 cblas_zhpr cblas_zhpr2
cblas_zgemm cblas_zsymm cblas_zhemm cblas_zherk cblas_zher2k cblas_ztrmm
cblas_ztrsm cblas_zsyrk cblas_zsyr2k

LAPACKE_ddisna LAPACKE_dgbcon LAPACKE_dgbsv LAPACKE_dgbsvx LAPACKE_dgbtrf
LAPACKE_dgbtrs LAPACKE_dgecon(*) LAPACKE_dgees LAPACKE_dgeesx LAPACKE_dgeev
LAPACKE_dgeevx LAPACKE_dgejsv LAPACKE_dgelqf LAPACKE_dgels(*) LAPACKE_dgelss
LAPACKE_dgelsy LAPACKE_dgeqp3 LAPACKE_dgeqrf LAPACKE_dgesv(*) LAPACKE_dgesvd
LAPACKE_dgesvdx LAPACKE_dgesvj LAPACKE_dgesvx LAPACKE_dgetrf LAPACKE_dgetri
LAPACKE_dgetrs LAPACKE_dgges LAPACKE_dggesx LAPACKE_dggev LAPACKE_dggevx
LAPACKE_dggglm LAPACKE_dgglse LAPACKE_dggsvd3 LAPACKE_dgtcon LAPACKE_dgtsv
LAPACKE_dgtsvx LAPACKE_dgttrf LAPACKE_dgttrs LAPACKE_dlamch(*) LAPACKE_dlange(*)
LAPACKE_dlansy(*) LAPACKE_dlantr LAPACKE_dorglq LAPACKE_dorgqr LAPACKE_dormlq
LAPACKE_dormqr LAPACKE_dpbcon LAPACKE_dpbsv LAPACKE_dpbsvx LAPACKE_dpbtrf
LAPACKE_dpbtrs LAPACKE_dpocon(*) LAPACKE_dposv(*) LAPACKE_dposvx LAPACKE_dpotrf
LAPACKE_dpotri LAPACKE_dpotrs LAPACKE_dppcon LAPACKE_dppsv LAPACKE_dppsvx
LAPACKE_dpptrf LAPACKE_dpptri LAPACKE_dpptrs LAPACKE_dptcon LAPACKE_dptsv
LAPACKE_dptsvx LAPACKE_dpttrf LAPACKE_dpttrs LAPACKE_dsbev LAPACKE_dsbevx
LAPACKE_dsbgv LAPACKE_dsbgvx LAPACKE_dsgesv LAPACKE_dspcon LAPACKE_dspev
LAPACKE_dspevx LAPACKE_dspgv LAPACKE_dspgvx LAPACKE_dsposv LAPACKE_dspsv
LAPACKE_dspsvx LAPACKE_dsptrf LAPACKE_dsptri LAPACKE_dsptrs LAPACKE_dstev
LAPACKE_dstevx LAPACKE_dsycon LAPACKE_dsyev(*) LAPACKE_dsyevx LAPACKE_dsygv
LAPACKE_dsygvx LAPACKE_dsysv LAPACKE_dsysvx LAPACKE_dsytrf LAPACKE_dsytri
LAPACKE_dsytrs LAPACKE_dtbcon LAPACKE_dtbtrs LAPACKE_dtpcon LAPACKE_dtptri
LAPACKE_dtptrs LAPACKE_dtrcon LAPACKE_dtrtri LAPACKE_dtrtrs LAPACKE_dtrttf
LAPACKE_dlatms

LAPACKE_slamch

LAPACKE_zcgesv LAPACKE_zcposv LAPACKE_zgbcon LAPACKE_zgbsv LAPACKE_zgbsvx
LAPACKE_zgbtrf LAPACKE_zgbtrs LAPACKE_zgecon LAPACKE_zgees LAPACKE_zgeesx
LAPACKE_zgeev LAPACKE_zgeevx LAPACKE_zgejsv LAPACKE_zgelqf LAPACKE_zgels
LAPACKE_zgelss LAPACKE_zgelsy LAPACKE_zgeqp3 LAPACKE_zgeqrf LAPACKE_zgesv
LAPACKE_zgesvd LAPACKE_zgesvdx LAPACKE_zgesvj LAPACKE_zgesvx LAPACKE_zgetrf
LAPACKE_zgetri LAPACKE_zgetrs LAPACKE_zgges LAPACKE_zggesx LAPACKE_zggev
LAPACKE_zggevx LAPACKE_zggglm LAPACKE_zgglse LAPACKE_zggsvd3 LAPACKE_zgtcon
LAPACKE_zgtsv LAPACKE_zgtsvx LAPACKE_zgttrf LAPACKE_zgttrs LAPACKE_zhbev
LAPACKE_zhbevx LAPACKE_zhbgv LAPACKE_zhbgvx LAPACKE_zhecon LAPACKE_zheev
LAPACKE_zheevx LAPACKE_zhegv LAPACKE_zhegvx LAPACKE_zhesv LAPACKE_zhesvx
LAPACKE_zhetrf LAPACKE_zhetri LAPACKE_zhetrs LAPACKE_zhpcon LAPACKE_zhpev
LAPACKE_zhpevx LAPACKE_zhpgv LAPACKE_zhpgvx LAPACKE_zhpsv LAPACKE_zhpsvx
LAPACKE_zhptrf LAPACKE_zhptri LAPACKE_zhptrs LAPACKE_zlange LAPACKE_zlanhe
LAPACKE_zlansy LAPACKE_zlantr LAPACKE_zpbcon LAPACKE_zpbsv LAPACKE_zpbsvx
LAPACKE_zpbtrf LAPACKE_zpbtrs LAPACKE_zpocon LAPACKE_zposv LAPACKE_zposvx
LAPACKE_zpotrf LAPACKE_zpotri LAPACKE_zpotrs LAPACKE_zppcon LAPACKE_zppsv
LAPACKE_zppsvx LAPACKE_zpptrf LAPACKE_zpptri LAPACKE_zpptrs LAPACKE_zptcon
LAPACKE_zptsv LAPACKE_zptsvx LAPACKE_zpttrf LAPACKE_zpttrs LAPACKE_zspcon
LAPACKE_zspsv LAPACKE_zspsvx LAPACKE_zsptrf LAPACKE_zsptri LAPACKE_zsptrs
LAPACKE_zsycon LAPACKE_zsyr LAPACKE_zsysv LAPACKE_zsysvx LAPACKE_zsytrf
LAPACKE_zsytri LAPACKE_zsytrs LAPACKE_ztbcon LAPACKE_ztbtrs LAPACKE_ztpcon
LAPACKE_ztptri LAPACKE_ztptrs LAPACKE_ztpttf LAPACKE_ztrcon LAPACKE_ztrtri
LAPACKE_ztrtrs LAPACKE_ztrttf LAPACKE_zunglq LAPACKE_zungqr LAPACKE_zunmlq
LAPACKE_zunmqr LAPACKE_zlatms

なお, 現在の版では実行時エラーメッセージの出力に関してオリジナルと異なる点があります.

  • 一部のエラーについてLAPACKE/CBLASではなく元のLAPACK/BLASのエラーメッセージが出力される. その場合, 引数の番号がLAPACKE/CBLASとは異なることがあるので読み替える必要がある.

LAPACKE/CBLASの詳細については以下のオリジナルサイト(英語)を参照してください.

LAPACKEの説明
LAPACKマニュアル (LAPACKEおよびCBLASを含む)

Cプログラム例(Visual C)をLAPACKEを使って書き換えた例を示します. 行列は行優先(C言語の本来の表記)で格納しています.

#include <stdio.h>
#include "lapacke.h"

int main(void)
{
    double a[3][3], b[3];
    int n = 3, nrhs = 1, lda = 3, ldb = 1, ipiv[3], info;

    a[0][0] = 10.0; a[0][1] = -7.0; a[0][2] = 0.0;
    a[1][0] = -3.0; a[1][1] = 2.0;  a[1][2] = 6.0;
    a[2][0] = 5.0;  a[2][1] = -1.0; a[2][2] = 5.0;
    b[0] = 7.0;
    b[1] = 4.0;
    b[2] = 6.0;

    info = LAPACKE_dgesv(LAPACK_ROW_MAJOR, n, nrhs, (double *)a, lda, ipiv, b, ldb);
    printf("info = %d\n", info);
    printf("x = %f  %f  %f\n", b[0], b[1], b[2]);
    return 0;
}

引用ライブラリ

LAPACK: http://www.netlib.org/lapack/
SLATEC: http://www.netlib.org/slatec/
MINPACK: http://www.netlib.org/minpack/
Note – MINPACK software is included with some modifications under the MINPACK Software License
Acknowledgment – This product includes software developed by the University of Chicago, as Operator of Argonne National Laboratory
CMLIB: Center for Computing and Applied Mathematics, NIST
FFTPACK5: http://www2.cisl.ucar.edu/resources/legacy/fftpack5
Note – FFTPACK5 software is included with some modifications under the FFTPACK5 Software License
Mersenne Twister: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

参考文献

D. Kahaner, C. Moler, S. Nash, “Numerical Methods and Software”, Prentice-Hall (1989)
E. Hairer, et al., “Solving Ordinary Differential Equations I”, Springer-Verlag (1993) (Note)
E. Hairer, et al., “Solving Ordinary Differential Equations II”, Springer-Verlag (1996) (Note)
Note – E. Hairer’s software is included with some modifications under Ernst Hairer’s License

Top