« 2019年2月 | トップページ | 2019年4月 »

2019年3月27日 (水)

[R]同点タイ有り順位をつける

rank関数を使う。ties.methodオプションに「"min"」を指定すること。以下、例。

> d <- c(90, 80, 80, 70, 50)
> rank(d, ties.method = "min")
[1] 5 3 3 2 1

rank関数は、昇順で順位をつけるため、これを数値が大きい順番で順位をつけるのであれば、順位の基準とする値が格納されているベクトルの正負を逆にすればよい。

> rank(-d, ties.method = "min")
[1] 1 2 2 4 5
> n <- rank(-d, ties.method = "min")
> data.frame(n, d)
n d
1 1 90
2 2 80
3 2 80
4 4 70
5 5 50

2019年3月13日 (水)

[R]行列の階数を得る

QR分解を行う関数qrの戻り値に階数がある(rank)。これを使用する。

> d1 <- rep(1, 9)
> ma1 <- matrix(d1, nrow = 3, byrow = TRUE)
> ma1
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1
> qr(ma1)$rank
[1] 1
> d2 <- c(1,1,1,0,1,0,0,0,1)
> ma2 <- matrix(d2, nrow = 3, byrow = TRUE)
> ma2
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    1    0
[3,]    0    0    1
> qr(ma2)$rank
[1] 3
> d3 <- c(1,1,1,0,0,1,0,0,0)
> ma3 <- matrix(d3, nrow = 3, byrow = TRUE)
> ma3
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    0    0    1
[3,]    0    0    0
> qr(ma3)$rank
[1] 2

2019年3月 6日 (水)

[C#]三角関数の値の計算

三角関数の値の計算はMathクラスのメソッドを使う。各メソッドの引数に与える角度の単位はラジアンであることに注意。

以下はそれぞれsin(90)、cos(45)、tan(30)の値を求めた例。

Mathクラスの三角関数の値を計算する引数は、角はラジアン単位で与えなければならないため、度をラジアンに変換する計算(πをかけて180で割る)をしている。

using System;
class Trifunc {
  public static void Main() {
    double d1, d2, d3, d4;
    d1 = Math.Sin(90 * Math.PI / 180);
    d2 = Math.Cos(45 * Math.PI / 180);
    d3 = Math.Tan(30 * Math.PI / 180);
    d4 = Math.Atan(Math.Sqrt(3) / 1);
    d5 = Math.Atan2(Math.Sqrt(3), 1);
    Console.WriteLine("{0}", d1);
    Console.WriteLine("{0}", d2);
    Console.WriteLine("{0}", d3);
    Console.WriteLine("{0}", d4 * 180 / Math.PI);
    Console.WriteLine("{0}", d5 * 180 / Math.PI);
  }
}

(出力)

1
0.707106781186548
0.577350269189626
60
60

逆正接関数 tan -1 x のみ特別なメソッドが用意されており、。通常はMath.Atanを使えばよいが、直角三角形の底辺の長さxと高さyを与えてそのタンジェント(正接)の角度を計算する場合は、Math.Atan2メソッドでも計算することができる。なお、引数の与え方はこの例ではMath.Atan2(y, x)である。

2019年3月 4日 (月)

[R]コンソール画面の表示を更新する

コンソール画面でsource関数でスクリプトを実行したとき、cat関数などで出力した結果はすぐには表示されない。例えば、以下の4行の内容をスクリプトファイルwait1.Rに保存する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
}

実行してみる。

> source("wait1.R")
1
2
3
4
5

実行後、数秒~十数秒間何も表示されずに待たされた後に、1から5までがまとめて表示されるはず。Rのコンソール画面では、cat関数などによるコンソールへの出力はまとめて出力されてしまう。これを、逐次表示されるようにするには、flush.console関数を使う。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}

以下の5行の内容をスクリプトファイルwait2.Rに保存する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}

実行してみる。

> source("wait2.R")
1
2
3
4
5

今度は、1から5までが順次表示されるはず。flush.console関数の場所で、コンソール画面の表示が更新されている。これは、例えば処理に時間のかかるスクリプトを作成し、その実行の経過をコンソール画面への出力で確認するときなど使えるテクニック。

VBA(Visual Basic for Applications)では、画面表示などを更新(画面表示のバッファを解放)するためにDoEvents関数を使用するテクニックがあるが、それと似たような動作と思えばよい(ただし、こちらはオペレーティングシステムに制御を一瞬渡すのであって、更新されるのは画面表示に限らないことに注意)。

なお、バッチ処理では、このようなコンソールへの出力はまとめて行われないことに注意。

2019年3月 2日 (土)

[R]計算機イプシロンを得る

計算機イプシロンとは、その計算機の計算で1 + ε > 1 が成立する最小の正数εのこと。計算機内での数値表現の制度の目安として使われる。Rでは.Machine変数に格納されている。.Machine変数のdouble.epsを参照する。これが計算機イプシロン。

> .Machine$double.eps
[1] 2.220446e-16

.Machine変数自体はリストで、その計算機の計算精度に関するいろいろな情報が格納されている。以下は、64ビット版のWindowsで64ビット版のR上で表示させた例。

> class(.Machine)
[1] "list"
> .Machine
$double.eps
[1] 2.220446e-16
$double.neg.eps
[1] 1.110223e-16
$double.xmin
[1] 2.225074e-308
$double.xmax
[1] 1.797693e+308
$double.base
[1] 2
$double.digits
[1] 53
$double.rounding
[1] 5
$double.guard
[1] 0
$double.ulp.digits
[1] -52
$double.neg.ulp.digits
[1] -53
$double.exponent
[1] 11
$double.min.exp
[1] -1022
$double.max.exp
[1] 1024
$integer.max
[1] 2147483647
$sizeof.long
[1] 4
$sizeof.longlong
[1] 8
$sizeof.longdouble
[1] 16
$sizeof.pointer
[1] 8

« 2019年2月 | トップページ | 2019年4月 »

無料ブログはココログ

■■

■■■