« 2019年10月 | トップページ | 2020年1月 »

2019年12月23日 (月)

[R]行列のトレース(固有和)の計算

Rには、行列Aのトレース(固有和)Tr(A)を求めるための関数が標準では組み込まれていない。diag関数とsum関数を組み合わせることで、計算を実現することができる。以下の例では、Tr(A) = 1+5+9=15である。

> mx <- matrix(1:9, nrow = 3, byrow = TRUE)
> mx
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> tr <- sum(diag(mx))
> tr
[1] 15

2019年12月20日 (金)

[C#]コマンドラインにおけるコンパイラーのオプション

C#のコンパイラー(csc.exe)のコンパイルオプションは、-optionもしくは/option という 2 つの形で指定することができる。

>csc.exe /debug Plateau.cs
>csc.exe -debug Plateau.cs

どちらを使用しても変わらない。
Windowsのコマンドプロンプトにおけるコンパイラ等のオプションは、慣例的に/(スラッシュ)が使われることが多いが、C#のコンパイラーでは-(ハイフン)も問題なく使用できる。これは、公式ページにも書かれている。

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/

2019年12月18日 (水)

[C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する

try-catch命令で例外をキャッチし、tryブロックで強制的に例外を発生させてみる(以下の例では、配列のインデックスに0を指定)。

} catch (Exception ex) {
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}

以下のような出力があるはず。

インデックスが配列の境界外です。
場所 ○○.Main(String[] args)

これでは例外が発生した場所がわからないため不便。コマンドラインでコンパイルをする際に-debugオプションを指定すると、例外が発生したときに発生場所(ソースコードの行番号)が出力されるようになる。

>csc.exe -debug ○○.cs

出力は以下のようになるはず。

インデックスが配列の境界外です。
場所 ○○.Main(String[] args) 場所 ○○.cs:行 ××

2019年12月17日 (火)

[gfortran]配列へのインデックスの指定のチェックと-fbounds-checkオプション

Fortranの配列の要素番号(インデックス)は、通常は1~であり、値を取り出すために指定をするインデックスは自然数で指定することになる。しかし、デフォルトでは、このインデックスの指定のチェックは甘い。例えば以下のソースコードを実行してみる。

implicit none
integer a, b
dimension a(3)
a(1) = 1
b = 0
a(2) = a(b)
b = -1
a(3) = a(b)
write(*,'(3(I3,1X))') a(1),a(2),a(3)
end

実行すると、以下のようになる。

>gfortran.exe -o array.exe array.f
>array.exe
1 0 0

配列aのインデックスに0や-1を指定しているのに、値が取り出せてしまっている。これを防ぐためには、コンパイル時に-fbounds-checkオプションを使用する。

>gfortran.exe -fbounds-check -o array.exe array.f
>array.exe
At line 6 of file array.f
Fortran runtime error: Index '0' of dimension 1 of array 'a' below lower bound of 1
Error termination. Backtrace:
Could not print backtrace: libbacktrace could not find executable to open
(以下省略)

配列のインデックスに0を指定していることが、実行時にチェックされており、この例ではプログラムが緊急停止していることがわかる。なお、上記のことは以下のコンパイラーで実行している。環境はWindows。

>gfortran --version
GNU Fortran (MinGW.org GCC-8.2.0-3) 8.2.0

2019年12月16日 (月)

[C#]文字列の一部の文字をバイト単位で抜き出す

C#は文字列の文字コードはUnicodeのため、例えばSubstringメソッドで文字列の一部を抜き出す場合は、文字単位でしか指定することができない。これをバイト単位で抜き出すには、以下のように文字コードにシフトJISを指定して、EncodingクラスのGetBytesメソッドとGetStringメソッドを利用する。

static string SubstringByte(string s, int i, int n) {
System.Text.Encoding sjis =
System.Text.Encoding.GetEncoding("shift_jis");
byte[] b = sjis.GetBytes(s);
return sjis.GetString(b, i, n);
}

第2引数にはSubstringメソッドと同様に、開始のインデックス(1文字目が0)を指定する。第3引数には抜き出すバイト数を指定する。

Console.WriteLine(SubstringByte("ABCDE", 0, 2));
Console.WriteLine(SubstringByte("ABCDE", 1, 3));
Console.WriteLine(SubstringByte("あいうえ", 0, 4));
Console.WriteLine(SubstringByte("あいうえ", 2, 2));
Console.WriteLine(SubstringByte("あいABC", 0, 5));
Console.WriteLine(SubstringByte("あいABC", 2, 4));
Console.WriteLine(SubstringByte("あいABC", 1, 4));

出力結果

AB
BCD
あい

あいA
いAB
(0xA0)いA ※先頭文字は画面表示不可の0xA0が表示

上記の自作メソッドは、マルチバイトの文字の処理は行っていない。そのため、最後の例のようにマルチバイトの文字列を分断するような指定をした場合は、バイト単位でそのとおりに処理されるので当然出力は乱れるので注意。

2019年12月 5日 (木)

[R]数値の表示桁数を変える

初期状態では、数値に関する各種処理の表示桁数は7桁。これを変更するには、options関数にdigitsオプションで指定をする。



> sqrt(2)
[1] 1.414214
> options(digits = 10)
> sqrt(2)
[1] 1.414213562

« 2019年10月 | トップページ | 2020年1月 »

無料ブログはココログ

■■

■■■