#include <fstream>
#include <codecvt>
#include <memory>
int main()
{
{ // ワイド文字列をUTF-8で書き込む
typedef std::codecvt_utf8_utf16<wchar_t> Cvt;
std::unique_ptr<Cvt> cvt(new Cvt());
std::locale loc(std::locale(""), cvt.get());
std::wofstream ofs("utf8.txt", std::ios::binary);
ofs.imbue(loc);
ofs << L"utf8で書き込む" << std::endl;
}
{ // ワイド文字列をUTF-16で書き込む
// UTF-16(LE)
typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> Cvt;
// UTF-16(LE) + BOM
// typedef std::codecvt_utf16<wchar_t, 0x10ffff, static_cast<std::codecvt_mode>(std::generate_header|std::little_endian)> Cvt;
// UTF-16(BE) ; default
// typedef std::codecvt_utf16<wchar_t> Cvt;
std::unique_ptr<Cvt> cvt(new Cvt());
std::locale loc(std::locale(""), cvt.get());
std::wofstream ofs("utf16.txt", std::ios::binary);
ofs.imbue(loc);
ofs << L"utf16で書き込む" << std::endl;
}
}
std::codecvt_utf8をlocaleに設定するとワイド文字列をUTF-16にしてファイルに書き込みます.
std::codecvt_utf16はデフォルトのテンプレートパラメータはUTF-16(BE)のbig endianなのでUTF-16(LE)を使いたいならstd::little_endianを指定する必要があります.
BOMも欲しければstd::generate_headerとの論理和とします.
ただし, それは第3パラメータなので第2パラメータMaxcodeも指定する必要があります. これは使う文字のコード番号の最大数でUCS-2なら21ビットなので0x10ffffです. 微妙に面倒ですね.
#include <string>
#include <fstream>
#include <iostream>
#include <locale>
int main()
{
std::locale loc("japanese");
std::wcout.imbue(loc);
{
std::wofstream ofs("a.txt");
ofs.imbue(loc);
ofs << L"こんにちは hello" << std::endl;
}
{
std::wifstream ifs("a.txt");
ifs.imbue(loc);
std::wstring str;
ifs >> str;
std::wcout << str << std::endl;
}
}
localeをjapaneseにしてifsにそれを設定してワイド文字を書き込むとcp932の文字コードに変換されてストリームに書き込まれる.
#include <stdio.h>
int main()
{
FILE *fp;
if (fopen_s(&fp, "b.txt", "w,ccs=UTF-8")) {
puts("err");
return 1;
}
const wchar_t str[] = L"こんにちはfopen with UTF-8\n";
puts("write");
fwrite(str, sizeof(*str), sizeof(str) / sizeof(*str) - 1, fp);
fclose(fp);
}
『ベイズ統計と統計物理』(伊庭幸人)
PRMLを読んでたらイジングモデルが出てきた. 統計物理(統計熱力学)は大学のときに一通り勉強したけど殆ど覚えてないし, 教科書は実家. どうしたもんかと思ったら, この本がたまたま手元にあって, 実は7年ほど前に読んでたのだけど今回再読した. で, 大正解. PRMLで, もやっとしてた部分があちこちクリアになった. 似たような人*, ぜひ読むべし. 薄いし.
(*)「1.5 人生は辛い」はPRMLのグラフィカルモデルにおける推論の肝. 3章はMCMC. 4章は事前分布って何?とか, モデルエビデンスの話など.
2章「統計物理アナロジー」を少しだけまとめてみよう.
たとえば結晶構造で分子のつながりぐあいを考える. 各分子が線で繋がっていて, それぞれの繋がりかたにある種の制約を入れたり, 状態があると考える. 各分子の状態xに対してその局所的なエネルギーをEloc(x)で表し, 全ての和を全体のエネルギーとする.
E(x) = Σ E_loc(x)
このとき平衡状態における状態xの出現確率P(x)を次の式で与える. kはボルツマン定数, Tは温度.
P(x) = exp(-E(x)/kT) / Σ_x exp(-E(x)/kT)
エネルギーが高いものはあまり起こりにくく, エネルギーが低いものが起きやすい. 出現確率の高いものが現れやすい状態である(というモデルを考える). これをカノニカル分布(ギブス分布, ボルツマン分布とも)という.
局所的な状態が+/-やS/Nの2値なものを考えるのがイジングモデル. エントロピーや誘電率, 磁性体の熱によって性質が変わる相転移などの現象を説明できて成功を収めた.
さて, 条件付き確率分布の式を眺めてみる.
P(x|y) = P(x, y) / Σ_x P(x, y)
yやTに相当するものは互いに無いけどそれはとりあえずおいとくと, これってなんとなく形が似てるよね, という話. 局所的な状態から全体の形が決まる部分とか, 解がただ一つではなくて複数の答えの重み付きの重なりぐあいだとかも.
なら, 歴史ある統計物理の様々な手法を確率的推論に使ってみよう. PRMLではイジングモデルを使った2値画像のノイズ除去の例が載ってるね. そういう手法の中で大成功したものの一つがMCMC(マルコフ連鎖モンテカルロ)ということなんだそうな. おもろい.