DOSEIの日記

技術メモ+日常ログ

プログラミング

Range based for の為の組み合わせ生成イテレータ

以下の例は昔のバージョンです。最新版は github に置いてみました。 github.com 実験で、全組合せに対して繰り返し処理をしたい時に使う。 先に使用例。 C++11 以降で使える range-based-for 文を使っているので、 gcc なら -std=c++11 (or -std=c++0x) が…

なす角

y 軸 (0,1,0) と適当なベクトル (a,b,c) のなす角をプログラムで求めるには、どの式を使えばより正確に求まるのだろうか。 を acos() で計算 小数で割り算して渡すので、精度の問題がある。 [−1, 1] をはみ出すとエラーとなることに注意が必要。計算誤差でそ…

Kernel Object の型

カーネル K のオブジェクトは、 CGAL::Point_2<K> CGAL::Polygon_2<K> のように書くのだが、カーネルオブジェクトと呼ばれるものたち (Point, Line, Segment, Ray, Vector, Direction, Triangle, Circle, Iso_rectangle, Iso_cuboid, Object, Sphere, Plane, Tetra</k></k>…

逐次更新ループの書き方

反復計算などで、前回の値を利用して、新しい値を逐次的に計算するプログラムについて。 例として、平方根の計算を考えると、 を、 x_0=1 の初期値 (なんでもいいけど) から順に計算していけばいい。プログラムでは、途中の値を残す必要はないので、順次上書…

value-initialized array by new operator

規格では 5.3.4 の 5 で、 int * a = new int [100] (); のように最後に括弧をつけることによって、 int 等の型でも value-initialized されることが規定されている。しかし、なぜか配列の new は初期化できないという説明がちまたであふれかえっている。ど…

valarray の代入演算子は同じサイズのデータをまるっとコピーする

std::valarray::operator=() は、サイズの異なる valarray 間では未定義。 vector のように assign チックには働かない。そして、この場合、エラーも出ない。したがって、初めてつかうときなど、あらかじめ、 std::valarray::resize() で容量を確保しておく。

変数の命名法

変数名で、順序に関することは英語的な名前をつけないようにしたい。例えば、(なんらかの)順序を持つ2つのオブジェクトは、数学ではよく、 p, p′ で表すだろう。コードなら、 p, p_next とかではなく、 p, pp とか、 p0, p1 とかがいいと思う。特に順序に意…

複数の構造をもった点集合の表現

たとえば、ある空間上の点を表す型 Point があるとする。 この点の集合は、たとえば配列とか、 std::vector とか。中身は実体でもいいし、ポインタでもいいし、点のIDでもいい。 で、この集合 A に、構造情報も付け加えたい。たとえば、 kd-tree とか、 Dela…

private メンバのアクセス

あるクラスのメンバ関数内では、同じクラスのインスタンスの private メンバにアクセスできる。 class A { public: A& operator+=(const A& rhs) { x_ += rhs.x_; // rhs.x_ にアクセス可能 return *this; } private: int x_; }; 知らなかった…。 friend に…

assertion プログラミングのすすめ

assertion とは id:DOSEI:20041116:p1 に書いたとおり。次の定理が成り立つ。 プログラムにバグがない ⇒ 全てのアサーションは真 逆は成り立たないが、十分多くのテストがアサーションを真にするならば、プログラムにバグがある可能性を下げることができる。…

Eigen 2, C++ template library for linear algebra

http://eigen.tuxfamily.org/ これはなかなか使いやすそう。 Fedora のパッケージにも含まれてる。ただし、バージョン 2 はまだベータ。

doublebuffered なコントロールを作る

以下, Visual C# 2008 Express での操作メモ. Form は Doublebuffered = true にできるので, ちらつかずにお絵描きできる モダンなコントロール MenuStrip や ToolStrip はクールだが, 伝統的なメニューとかと違い, クライアント領域の上に乗っかってるので,…

これはひどい。あまりにもひどい。

"C/C++のポインタの機能--変数の場所(アドレス)" とにかく、驚愕のプログラム int *n; *n=5;最初の記事からどう変わったかは、コメント欄参照。しかし、「第三者のレビュアーにご協力頂き」って、これを直して公開する価値はあるのか?

16 進数の 0 パディング

function Hex(x) { var hx = x.toString(16); return "00000000".substring(hx.length) + hx; }

2007 PRMUアルゴリズムコンテストのプログラムが Cygwin で make できない

http://www.eml.hiroshima-u.ac.jp/alcon2007/ アルコン2007SDK v1 を Cygwin で make すると gcc -O2 -I. -I./libs -c -o libs/ac2007lib-mem.o libs/ac2007lib-mem.c libs/ac2007lib-mem.c: In function `my_clock': libs/ac2007lib-mem.c:46: error: stor…

GSL で横長行列の SVD

GSL の gsl_linalg_SV_decomp() は正方行列か縦長行列しか受け付けない。 横長行列の零空間を求めるには, 正方行列になるように 0 で埋めればいい。 関連 id:DOSEI:20061229:p1 id:DOSEI:20060511:p2

ostream_iterator

ある vector 要素をアルゴリズムを使ってストリームに適用させたいときがある。例えば、自分で作った型 Vec (vector と紛らわしいな)があって、これは std::ostream& operator を持っている。このとき vector<Vec> a を全部表示したい。 方法 1 (for) for(size_t</vec>…

後方互換関数を使わないようにする

OpenCV は、過去の互換性のために、古いバージョンの関数を cvcompat.h (cv.h で読み込まれる) で宣言している。しかし、このファイルのコメントに将来削除する可能性がある (They are obsolete and are likely to be removed in future.) とあるため、使わ…

行列ライブラリ

boost には、 行列を扱うクラス群 uBLAS が用意されている。 uBLAS Overview どうやら BLAS のラッパーらしい。特徴として、expression template なるものを駆使した遅延評価による高速化がある。 ヘッダは boost/numeric/ublas/**.hpp で、名前空間は boost…

外部仕様としてのコメント

関数の説明をコメントで書く時に、気をつけることは、全ての引数の意味を書くこと。そうやって研究室の人には言っているのだが、一応ココにも書いておく。私がお奨めする方法は、全ての引数が登場する文で関数を説明すること。例えば、 void DrawEpiline(Ima…

途中判定ループ (2)

前書いた( id:DOSEI:20060701:p3 ) 続き。日本語では見つからなかったけど、英語で発見。"mid-test loop" Experimental C Tutorial - Part 4-1 "We can solve this most naturally" と書かれている。 http://www.cs.fsu.edu/~engelen/courses/COP4020/notes6…

標準 C++ では, cmath の各関数は float, double, long double にオーバーロードされている。 例えば, abs() は double abs(double x); float abs(float x); long double abs(long double x);が定義されている。参考: http://www.ishiboo.com/~nirva/c++/stl…

途中判定ループ

前判定、後判定ループだけじゃなくて、途中判定ループがあればいいなと思うとき。 先読み処理のループ #が現れるまで処理。多分次の3つのどれかになる。 1. 2度同じことを書く c = i.read(); while(c != '#') { o.write(c); c = i.read(); } or for(c = i.re…

perl と C のループ

昨日書いた redo だが、 perl にはあるのか。 C perl 制御 continue next ループ末尾にジャンプ(残りの処理をスキップ) break last ループの脱出 - redo ループの先頭にジャンプ(ループのやり直し, 条件判断や再初期化はしない) perl にある while につける …

redo

ループ制御の末尾にジャンプする continue より, ループ制御の最初にジャンプしてやり直す redo がある方が便利な気がする.

CVS 版の RPM 作成

以下の手順で RPM パッケージを作成。環境は Fedora Core 4. CVSで作った opencv ディレクトリを opencv-cvs20060510 にリネーム。 OpenCV 0.9.7 の opencv.spec をコピーしてくる(適当な対処法)。 このファイルの Copyright は古い、とエラーが出るので L…

cvPerspectiveTransform()

0.9.7 のマニュアルでは 3チャンネルであるとかかれているが、ほんとは 3x3 の行列なら 2チャンネルでなければいけない。なお、2次元の場合は という変換をする。

雑感

CvPoint と行列との相性というか、インタフェースが悪すぎると思う。画像上の点 CvPoint p を何か透視変換してまた CvPoint q に戻すには、 CvMat *pp = cvCreateMat(1, 1, CV_32FC2); // 2チャンネルの1x1行列 CvMat *qq = cvCreateMat(1, 1, CV_32FC2); cv…

行列の掛け算

OpenCV のマニュアルの索引を見回しても、行列の積を求める関数が見当たらない。 cvMul() は要素同士の積だし…実は、 cvGEMM() という「一般化」された積を求める関数が用意されている。そこにその簡略化バージョンとして、 cvMatMulAdd() cvMatMul() という…

終了ステータスコード

プログラムが終了したときに OS に渡される値。 Windows ではほとんど使われるシーンはないが、 %ERRORLEVEL% 環境変数で参照できる。Linux の bash では $?。