2008-01-01から1年間の記事一覧

マクロにしかできないこと 〜C++でマクロを使うべきな場面〜

C++では, #define で定数を定義するな, const TYPE によるグローバル変数(もしくは適当な名前空間に内包されたグローバル変数)を使え, #define でマクロ関数を定義するな,代わりに inline 関数を使え,みたいなことが言われる.これは確かにその通りだ…

構造体のインスタンスが const で修飾されているとき メンバに値を代入する方法 〜危険なコードと安全なコード〜

適当な構造体 TTest のインスタンスが const で修飾されているとき(const TTest x),そのメンバに値を代入したい,でもそのためだけにそのインスタンス(x)から const を外すのは嫌,という場合を考えよう.あるいは const メンバ関数(メンバ変数を変更し…

メモリの二重解放回避テク

メモリの二重解放とは, new などで確保したメモリ領域(ヒープ領域)を2回 delete などで解放することを言う. new と delete をきちんと対応させて書いていないときに起こる問題だ.特にクラスのメンバに動的確保したメモリへのポインタを含む場合にやって…

テンプレート関数の明示的インスタンス生成

通常,C++のテンプレート関数(orクラス)をライブラリ化するとき,それを利用するソースから,そのテンプレート関数の実装(定義)も含めてインクルードしなければならない.そうしないと,特定の型に対してテンプレート関数のインスタンスを生成できないから…

void func1(..) を void func2(..) から return できるか検証

戻り値が void 型である関数 func1 を,戻り値が void 型であるほかの関数 func2 において, return func1(..); のように返せるか実験してみた.

LaTeX の数式を PNG と SVG に変換するスクリプト

先日,LaTeX の数式を PNG と SVG に変換する方法についての記事を載せた.この方法を使いやすくスクリプト化してみた.

コンパイルするファイル間の依存性はできるだけ減らそう 〜liboctaveへん〜

liboctave 利用時のコンパイルを「遅い」と感じたことはないだろうか.ここでは liboctave におけるヘッダファイルの依存関係を把握することにより,コンパイルを高速化する方法を検討する.

テンプレートの部分特殊化を利用した間接参照型推定

C++の機能,テンプレートの部分特殊化 (Wikipedia)を使って,あるポインタ型orイテレータ型から,それを間接参照した(or逆参照した,orポインタをとっぱらった)型を推定する方法を紹介する.

bashで2次元配列モドキ

bash で2次元配列を扱いたいときがまれにある.が, bash には1次元配列しか無いし,配列の要素に配列を代入することもできない.そこで疑似的に2次元配列を使う方法を考えてみた.

仮想関数の継承とデフォルトパラメータの関係

デフォルトパラメータを持つ仮想関数を継承する場合の振る舞いを調べてみた.仮想関数は「動的に結合」される一方,デフォルトパラメータは「静的に結合」される.

配列の要素に名前をつける

C/C++ で配列の各要素に名前をつける方法について.例えば, unsigned char col[4]; として宣言された col の各要素を red, green, blue, alpha のような識別子でも参照できるようにする.

std::vector, liboctave の ColumnVector, 配列に共通の関数

STL (標準テンプレートライブラリ) の std::vector とか liboctave の ColumnVector,あるいは普通の配列に対して共通に使えるテンプレート関数の作り方を説明する.

C と C++ の間で関数や変数を共有する

C++ で実装した関数を C から利用したい場合,あるいはその逆の場合がある.同じソースの中に両方のプログラムコードを書くことはできないが,それぞれのソースをコンパイルしてオブジェクトファイルを生成し,それらをリンクすることは可能だ.ただし C++ …

nVIDIA (GeForce), KDE, (Debian) でフリーズする

nVIDIA の GeForce 8800 GT を搭載しているマシンに, Debian-lenny をインストールし, KDE 3.5.9 で作業している.夜パソコンを起動したまま帰宅し朝見てみると, X.Org が固まっている.この問題を解決できたようなので,レポートする.

壊れたシンボリックリンクを一覧する

linux で,リンク先のファイルが存在しないシンボリックリンクを一覧するスクリプト.

プリプロセッサ #warning は非標準

ふと気になって,C++のプリプロセッサ・ディレクティブ (Preprocessing directives) を調べてみた.ソースは ISO/IEC 14882:1998 (E).gcc/g++ で何気なく使っていた #warning は標準じゃないことを知った.

Gnuplot のコンパイルとインストール

Gnuplot (4.2.4) は,ライセンスの関係がどうとかで readline がデフォルトでは使えない.このためコマンドプロンプト上でファイルを Tab キーとかで補完できないので不便だ.そこで自分でコンパイルする.

端末に色つきテキストを出力する

iomanip の setw(5) みたいなノリで,出力する文字に色をつける方法を考える. cout<

LaTeX の数式を PNG と SVG に変換する

似たような話題は検索すればいくらでも見つかる.が,イマイチなのが多い(ような気がする).ここでは日本語とかも出力できる方法を解説する.かなり力技なので環境依存性が強いかも.

Adobe Flash Player をインストールしたのに firefox でバージョンが変わらない

Adobe Flash Player 9 の Firefox 用を adobe のサイトから取って来てインストールしたのに, firefox/iceweasel で Flash Player のバージョンが古いままな現象の解決方法について (環境: debian/linux).

liboctaveで主成分分析 -特異値分解を使う-

C++ と liboctave でPCAをするプログラム.データの共分散行列を求めて,これを特異値分解するというやりかた.一般的に,固有値分解のよりも精度がいいらしい (Principal components analysis, Wikipedia, The Free Encyclopedia).

liboctaveで主成分分析 -固有値分解を使う-

C++ と liboctave でPCAをするプログラム.データの共分散行列を求めて,その行列を固有値分解するという,テキストに載っているやりかた.

liboctaveで主成分分析 -サンプルデータ生成-

PCA (主成分分析) にかけるデータの生成プログラム. sample.dat に出力データを保存してあるので,これを使えばPCAのプログラムが実行できます(よって以下は興味がある人だけ).

cos と std::cos は別物だっていう話

C++には関数のオーバーロードがあるから,Cの cosf みたいに型ごとに関数を区別して書く必要が無い. cos(x) と書けば, x の型を自動で判別してくれるということだ.が,落し穴が.

liboctave + C++で可能なことを増やすために

octave は Matlab には劣るかもしれないが,かなり多くのことができる.それらのうち, liboctave で実装されているものはもちろん C++ から利用できるのだが,そうでないもの,例えばスクリプトやDLDなどによって提供されているものについても, C++ から利…

LU分解

LU分解 (LU decomposition) の用途: 連立方程式を解くなど.正方行列でなくともよい.

コレスキー分解

コレスキー分解 (Cholesky decomposition) の用途: サンプルデータの前処理, Ax = b の数値解,モンテカルロ法,カルマンフィルタなど(一部 Cholesky decomposition - Wikipedia, the free encyclopedia より). 正定値エルミート行列 (実数値行列なら…

特異値分解

特異値分解 (Singular value decomposition, SVD) の用途: 主成分分析,疑似逆行列の計算,機械学習,パタン認識,数値解析など.任意の形の行列を分解できる.

固有値分解

固有値分解 (Eigendecomposition) の用途: 主成分分析など多数. 正方行列 に対してのみ適用可能(非正方の場合は特異値分解).

行列式

行列式 (determinant) の計算は,例えば多次元のガウス関数を扱うときなどに必要だ.