C++

Windows サービスプログラムからユーザプログラムを実行する方法 - その2

Windows サービスプログラムからユーザプログラムを実行する方法 の続きです。 前回は winlogon.exe のトークンを元にプロセスを起動させましたが、今回はログオンユーザのリンクトークン(自身の制限されたトークンに紐付く管理者トークン)を元に、ログオ…

C++ による RC4(Arcfour) 暗号化

「ARCFOUR Algorithm」を C++ に移植したので紹介します. 以下に実装する関数 encrypt_rc4/decrypt_rc4 を用いればバイト列(std::vector)を暗号化/復号化できます. RC4 については「RC4」をご覧下さい. それでは以下に私の実装を示します.rc4.hpp #ifnd…

C++ による base64 エンコード/デコード

C++

C++ で base64 にエンコード/デコードするプログラムを作成したので紹介します.以下に実装する関数 encode_base64/decode_base64 を用いればバイト列(std::vector),プレインテキスト(std::string) 間でデータを変換できます. base64 については「Base64」…

ICU による文字コード変換ライブラリ

C++ で文字コードを変換するプログラムを作成したので紹介します.以下に実装する関数 encode を用いれば std::string, std::wstring 間で文字コードを変換できます. 文字コードの変換には代表的なライブラリとして libiconv と ICU とありますが,主にライ…

Windows サービスプログラムからユーザプログラムを実行する方法

今回は Windows の Service からプログラムを起動する方法を紹介します.Vista 以降ではサービスからユーザセッションにプログラムを実行するには CreateProcessWithLogonW を使用しますが,ここでは指定したプロセスのトークンを複製して CreateProcessAsUs…

Windows のエラー文字列の取得

今回は Windows の GetLastError() などが返すシステムエラーコードに対応するエラー文字列を返す関数を作成します. エラー文字列は例えば C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include などにある WinError.h というファイルに書かれているので…

Boost.uBLAS で最小二乗法

今回は AX = B の最小二乗解(Least squares solution),あるいは最小ノルム解(Minimum norm solution)を計算します.lapack を用いてこれを計算するには dgels, dgelss, dgelsd という関数を用いればよく,対応する bindings のヘッダファイルは gels.hpp, g…

Boost.uBLAS で正値対称係数行列の線形方程式系(System of linear equations)の解の計算

今回は AX = B の解行列 X あるいは Ax = b の解ベクトル x を計算する関数を実装します.ただし,A は正値対称行列であるとします. lapack には dposv という関数があり,これが内部で係数行列をコレスキー分解して解を計算してくれます.つまり,前回と同…

Boost.uBLAS で一般係数行列の線形方程式系(System of linear equations)の解の計算 - lapack版

今回は前回の連立方程式の計算を lapack を用いて実装します. lapack には dgesv という関数があり,これが内部で係数行列をLU分解して解を計算してくれます.私たちがするべきことといえば,いつものように bindings.lapack.gesv に渡す column_major な行…

Boost.uBLAS で一般係数行列の線形方程式系(System of linear equations)の解の計算

今回は AX = B の解行列 X あるいは Ax = b の解ベクトル x を計算する関数を実装します.uBLAS にはLU分解を計算する機能が既にあるため,これらの機能を簡単に実装することができます. また,uBLAS による連立方程式の解き方は Boost 数学関係ライブラリ…

Boost.uBLAS でコレスキー分解

今回はコレスキー分解を実装します.コレスキー分解はLU分解の特別な場合であり,入力行列 A が正値対称行列なら,これを A = L x trans(L) あるいは A = trans(U) x U に分解することができます.コレスキー分解は lapack.dpotrf で計算することができます…

Boost.uBLAS で行列式 - lapack版

今回は前回実装した行列式を lapack を用いて実装してみます. 前回と同様にまずLU分解をして,その結果を基に行列式を計算する流れになります. LU分解は前回と同じく lapack.dgetrf を用います.その結果である上三角行列の対角成分の積を計算するだけで行…

Boost.uBLAS で逆行列 - lapack版

今回は前回実装した逆行列を lapack を用いて実装してみます. 前回と同様にまずLU分解をして,その結果を基に逆行列を計算する流れになります. LU分解は前回と同じく lapack.dgetrf を用います.その結果を lapack.dgetri に渡すだけで逆行列を計算できま…

Boost.uBLAS でLU分解 - lapack版

今回は前回実装したLU分解を lapack を用いて実装してみます. 前回は正方行列に限定してLU分解しましたが,今回は PA = LU の形に分解するため,任意の行列をLU分解できます. その代償としてLU分解後の行列の切り出しの処理が必要になり,コード量が増えて…

Boost.uBLAS でLU分解

今回はLU分解を実装します.LU分解を計算する関数はもちろん lapack にもあるのですが,それは次回紹介するとして,今回は uBLAS に実装されている lu_factorize を用いてLU分解してみようと思います.uBLAS の lu_factorize の結果を三角行列に切り出すだけ…

OpenCV での画素値の安全な取得

OpenCV の開発者は非常に多くの機能を実装し提供してくれていますが,最も基本となる画素値への参照にはあまり関心がないようです.CV_IMAGE_ELEM や cvGet*D cvSet*D という機能は用意されていますが,使いにくくしかも安全ではありません. というのも,画…

Boost で正規乱数の生成

シミュレーション実験を行っていると正規乱数が必要になることがよくあります.正規乱数はかなり基本的な乱数であるためさまざまなライブラリに実装されているのですが,私は Boost をよく使っているので,正規乱数でも Boost を使用して発生させています. …

Boost.uBLAS の補完ライブラリの使い方 - その4

今回はベクトルの外積と,前回紹介したuBLASの補完ライブラリの外積の使い方について説明します. 今回説明するのは次の機能です. cross_prod uBLAS には外積を計算する関数がありません.outer_prod というそれらしい名前のものがありますが,これは外積で…

Boost.uBLAS の補完ライブラリの使い方 - その3

今回も前回紹介したuBLASの補完ライブラリの一部の機能について説明します. 今回説明するのは次の機能です. sum trace diag_prod sum は行列の全成分の和を返します.これは boost.numeric.ublas.sum の行列版です. boost.numeric.ublas.sum は何故かベク…

Boost.uBLAS の補完ライブラリの使い方 - その2

今回も前回紹介したuBLASの補完ライブラリの一部の機能について説明します. 今回説明するのは次の機能です. norm_2_sq norm_frobenius_sq これらはそれぞれ ublas.norm_2, ublas.norm_frobenius の自乗を返します. しかし,皆さんはこれらの機能を冗長だ…

Boost.uBLAS の補完ライブラリの使い方 - その1

今回は前回紹介したuBLASの補完ライブラリの一部の機能について説明します. 今回説明するのは次の機能です. abs sqrt square log log10 apply_to_all 使い方はとても簡単で,行列やベクトルにこれらの関数を適用するだけです. 例えば abs を適用した場合…

Boost.uBLAS の補完ライブラリ

uBLAS は行列とベクトルに関する基本的な線形代数の演算を提供していますが,一部の演算は未だ実装されていません. 例えば,uBLAS には行列のトレース(Trace)やベクトルの外積(Cross product)を計算する関数はありません. そこで,uBLAS に実装されていな…

Boost.uBLAS の遅延評価について

今回は uBLAS の遅延評価について説明します. uBLAS が他の数ある行列演算ライブラリと比べもっとも性質を異にしているものがこの遅延評価です. これは uBLAS 最大の特徴であり,Expression template という技法により実現されています. その実装はとても…

Boost.uBLAS で対称行列の一般化固有値分解(Generalized eigenvalue decomposition)

前回の固有値分解に続き,今回は対称行列の一般化固有値問題を解きます. 一般化固有値問題には lapack.dsygv を用いるだけで,コードも固有値分解のときとほとんど同じで,簡単に実装することができます. 以下に私の実装例を示します.math.hpp #ifndef MA…

Boost.uBLAS で対称行列の固有値分解(Eigenvalue Decomposition) - 高速版

前回は lapack.dsyev による固有値分解(スペクトル分解)を紹介しました. lapack にはもう一つ固有値分解を行う関数があります. それが今回紹介する lapack.dsyevd になります. dsyev との違いは分割統治法(divide-and-conquer method)により処理を高速…

Boost.uBLAS で対称行列の固有値分解(Eigenvalue Decomposition)

前回のQR分解に続き,今回は対称行列の固有値分解(スペクトル分解)を実装します. QR分解のときと違い,lapack.dsyev を用いるだけなので,特異値分解のときと同様に非常に簡単に実装することができます. 以下に私の実装例を示します.math.hpp #ifndef M…

Boost.uBLAS でQR分解

前回の特異値分解に続いて,今回はQR分解を実装してみます. 特異値分解はあっけないほど単純に実装できたのですが,QR分解はそれよりも少し長くなります. なぜなら,特異値分解は lapack.dgesvd(lapack.dgesdd) を呼び出すだけで良かったのですが,QR分解…

Boost.uBLAS で特異値分解(SVD) - 高速版

前回は bindings.lapack.gesvd による特異値分解を紹介しました. lapack にはもう一つ特異値分解を行う関数があります. それが今回紹介する bindings.lapack.gesdd(lapack.dgesdd) になります. gesvd との違いは分割統治法(divide-and-conquer method)に…

Boost.uBLAS で特異値分解(SVD)

Boost.uBLAS と Boost.Bindings, clapack をインストールした今,特異値分解を簡単に実装することができます. というのも,Boost.Bindings を通して bindings.lapack.gesvd(lapack.dgesvd) を呼び出すだけだからです. 以下に私の実装例を示します.math.hp…

Boost.uBLAS で行列式

前回は逆行列を紹介しました.逆行列の次にくるものと言えば,やはり行列式でしょう(どちらかというと逆かもしれませんが). 逆行列のときと同様に,行列式を求める関数もuBLASには存在しないため,自分で作るなりどこかからもってくるなりしなくてはなり…