« 2015年2月 | トップページ | 2016年3月 »

[Haskell]関数型の遅延評価って

箱を作ってみる ...

<プ> プログラム

<コ> コンピュータ

■ 命令型では

<プ> 「幅 3cm、高さ 3cm、厚さ 1cmの板を400枚、用意してください」

<コ> 「はい」 (せっせと板を作る!)

<プ> 「幅 4cm、高さ 4cm、厚さ 1cmの板を100枚、用意してください」

<コ> 「はい」 (せっせと板を作る!)

<プ> 「長さ 3cmの釘を、えーっと・・・、とりあえず1000本、用意してください」

<コ> 「はい」 (せっせと釘を作る!)

<プ> 「板を組み合わせて、釘を打って、100個の箱を作ってください」

<コ> 「はい」 (箱を組み立てる)

・・・

<コ> 「エラー、釘が足りません。終了します」

<プ> 「・・・」

処理に失敗した上に、板と釘を作った時間が無駄・・・

■ 関数型では

<プ> 「幅 3cm、高さ 3cm、厚さ 1cmの板は、こうやって作ります」

<コ> 「はい、覚えました」 (作業は何もしない)

<プ> 「幅 4cm、高さ 4cm、厚さ 1cmの板は、こうやって作ります」

<コ> 「はい、覚えました」 (作業は何もしない)

<プ> 「長さ 3cmの釘は、こうやって作ります」

<コ> 「はい、覚えました」 (作業は何もしない)

<プ> 「箱は、板をこう組み合わせて、釘をここに打って作ります」

<コ> 「はい、覚えました」 (作業は何もしない)

<プ> 「では、箱を100個作ってください」

<コ> 「はい」 (板を作る。釘を作る。箱を組み立てる。これを繰り返す)

・・・

<コ> 「できました」

<プ> 「ありがとう」

・・・

<プ> 「追加で、箱を10個、作ってください」

<コ> 「はい」 (板を作る。釘を作る。箱を組み立てる。これを繰り返す)

・・・

<コ> 「できました」

<プ> 「ありがとう」

 もし、板の作り方、釘の作り方を教えた後、予定が変わって、箱を作る必要がなくなったとしても、まだ作業を行っていないので、時間の無駄にはならない。

 必要になるまで処理を行わないのが、遅延評価・・・だと思う

[C#]R.NETを使う(書き方)

C#でRを利用しようとした場合の備忘録 書き方

using (var engine = REngine.GetInstance())
{
    var rData = engine.CreateNumericVector(data.Select(d => d.open));
    engine.SetSymbol("data", rData);
    engine.Evaluate(@"
        data.ts <- ts(data,freq=365,start=c(2001,1))
        decomp <- decompose(data.ts)
        trend <- decomp$trend
        seasonal <- decomp$seasonal
        random <- decomp$random");
    var trend = engine.GetSymbol("trend").AsNumeric().ToArray();
    var seasonal = engine.GetSymbol("seasonal").AsNumeric().ToArray();
    var random = engine.GetSymbol("random").AsNumeric().ToArray();
}

REngineのCreateXXXメソッドで、C#のデータをR.NETのデータに変換

SetSymbolメソッドで、R.NETのデータをRで処理できるようにシンボルを設定

Rのコードは、Evaluateメソッドで実行

Rのシンボルは、GetSymbolメソッドでR.NETのデータとして取得し、
AsXXXメソッドで、C#のデータとして扱えるように変換

[C#]R.NETを使う(導入)

C#でRを利用しようとした場合の備忘録 導入

  1. PCにRをインストール(64bitOSの場合、32bit / 64bit両方のRをインストールすること)
  2. VSで、参照の「NuGet パッケージの管理」から、"R.NET.Community"をインストール
  3. VSで、以下のコードを記述

REngine.SetEnvironmentVariables(
    rPath: @"C:\Program Files\R\R-3.2.3\bin\i386",
    rHome: @"C:\Program Files\R\R-3.2.3");

using (var engine = REngine.GetInstance())
{
    // Rでの処理を記述
}

SetEnvironmentVarialbesのrPathには、インストールしたフォルダの下にある、32bit版のR.dllが置かれたフォルダを指定する

rHomeには、Rをインストールしたフォルダを指定する

上記のコードは、Rのver.3.2.3での記述

[C#]匿名クラスのIEnumerableオブジェクトから、あるフィールドが最大となる要素を取得する

var max = Enumerable.Range(0, 100)
    .Select(i => new { name = "name_" + i, value = 50 - Math.Abs(i - 50) })
    .Aggregate((now_max, item) => (now_max.value >= item.value) ? now_max : item);
Console.WriteLine(max.name);

3行目、各要素(item)を、ある時点で最大とされる要素(now_max)と、valueフィールドで比較する。
IEnumerable<T>のMaxでは、上記のようなことが出来ないのが残念。

« 2015年2月 | トップページ | 2016年3月 »

2019年10月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ