#/*********************************************************** # matutil.c -- 行列 #***********************************************************/ # 行列操作の小道具集 def error(message) $stderr.printf("\n%s\n", message) exit 1 end def new_vector( n) vector = [] n.times { vector.push(0) } vector end def new_matrix( nrow, ncol) rowvector = [] matrix = [] ncol.times { rowvector.push(0) } nrow.times { matrix.push(rowvector.dup) } matrix end def innerproduct( n, u, v) s = 0; n5 = n % 5 for i in 0...n5; s += u[i]*v[i]; end if n < 5; return s; end n5.step(5, n-1) do |i| s += u[i]*v[i] + u[i+1]*v[i+1] + u[i+2]*v[i+2] \ + u[i+3]*v[i+3] + u[i+4]*v[i+4] end return s end def vecprint(v, n, perline, format) k = 0 for j in 0...n printf(format, v[j]) if ((k += 1) >= perline) k = 0; printf("\n") end end if (k != 0) printf("\n") end end def matprint( a, ncol, perline, format ) n = a.size for i in 0...n vecprint(a[i], ncol, perline, format) if (ncol > perline) printf("\n") end end end #******* 以下は簡単な使用例 ******* =begin $rand_max = 1 begin srand(Time.new.to_i); # 乱数の種を設定 nrow = rand(100) % 10 + 1; # 行の数 ncol = rand(100) % 10 + 1; # 列の数 a = new_matrix(nrow, ncol); # 行列を作る for i in 0...nrow for j in 0...ncol a[i][j] = 10.0 * rand / $rand_max end end printf("%d × %d 行列:\n", nrow, ncol) matprint(a, ncol, 4, " % -14g"); # 出力 end =end