質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1550閲覧

rubyを使った計算方法

sakuya_izayoi

総合スコア19

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/04/03 10:08

ruby を用いた二乗および平方根の計算方法が知りたいです。

rubyで外部ファイル、たとえばtest.txtに
番号 南北方向速度 東西方向速度 鉛直方向速度
1 -1.94E-06 1.33E-06 -2.78E-08
2 -5.00E-06 4.59E-06 -5.14E-08
3 -1.15E-05 1.24E-05 -8.93E-08
4 -3.02E-05 3.64E-05 -1.22E-07
5 -8.43E-05 1.03E-04 -3.38E-07
6 -2.16E-04 2.59E-04 -8.88E-07
7 -1.76E-04 2.09E-04 -1.07E-06
8 -2.49E-04 3.55E-04 -2.31E-07
9 -4.46E-04 6.89E-04 -3.62E-07
10 -8.96E-04 1.36E-03 1.52E-07
11 -1.35E-03 2.00E-03 2.57E-06
以下継続

と記載されているとします。
このファイルを読み込んで
番号 合成速度
1 2.36E-06
2 6.79E-06
3 1.69E-05
4 4.73E-05
5 1.33E-04
6 3.37E-04
7 2.73E-04
8 4.34E-04
9 8.21E-04
10 1.63E-03
11 2.42E-03
以下継続

と計算できる方法はあるのでしょうか?
コマンドライン上に手動で一つずつ値を打ち込む方法は最近分かったのですが、外部ファイルを参照させた場合が分かりません。

行いたい数式としては
{(南北方向速度^2+東西方向速度^2+鉛直方向速度^2)}^(1/2)
であります。(一般的な3次元合成ベクトル求める計算式です。)
test.txtはスペース区切りの場合とカンマ区切りの場合があります。(カンマ区切りの場合はスペース区切りに一括置換は可能でした。)

エクセルでやればよいと思ったのですが、行数がやたらと多く、エクセルがハングアップしてしまい困ってしまいました。
質問するだけになり、申し訳ありませんがお答えいただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

calc.rb

ruby

1FILE_NAME = 'data.txt' 2OUT_COL_NAMES = '番号 合成速度' 3 4def calc(line) 5 _, x, y, z = line.gsub(',', ' ').split.map { |s| s.to_f } 6 result = Math.sqrt(x ** 2 + y ** 2 + z ** 2) 7end 8 9File.open(FILE_NAME, 'r') do |f| 10 f.each_line.with_index { |line, idx| 11 out_line = idx.zero? ? OUT_COL_NAMES : "#{idx}#{sprintf('%10.2E', calc(line))}" 12 puts out_line 13 } 14end

data.txt

番号 南北方向速度 東西方向速度 鉛直方向速度 1 -1.94E-06 1.33E-06 -2.78E-08 2 -5.00E-06 4.59E-06 -5.14E-08 3 -1.15E-05 1.24E-05 -8.93E-08 4 -3.02E-05 3.64E-05 -1.22E-07 5 -8.43E-05 1.03E-04 -3.38E-07 6 -2.16E-04 2.59E-04 -8.88E-07 7 -1.76E-04 2.09E-04 -1.07E-06 8 -2.49E-04 3.55E-04 -2.31E-07 9 -4.46E-04 6.89E-04 -3.62E-07 10 -8.96E-04 1.36E-03 1.52E-07 11 -1.35E-03 2.00E-03 2.57E-06 12, -1.35E-03, 2.00E-03, 2.57E-06

実行例

$ ruby calc.rb 番号 合成速度 1 2.35E-06 2 6.79E-06 3 1.69E-05 4 4.73E-05 5 1.33E-04 6 3.37E-04 7 2.73E-04 8 4.34E-04 9 8.21E-04 10 1.63E-03 11 2.41E-03 12 2.41E-03

投稿2017/04/03 14:17

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuya_izayoi

2017/04/03 15:47

katoy様。ありがとうございます。 _, x, y, z = line.gsub(',', ' ').split のところで、列に名前を付けるのですか。それで、どの列を計算しなさいという指示を出す、という塩梅でしょうか? (',', ' ').split というのはカンマ区切りスペース区切りどちらでも区切ってくれる構文なのですね。初めて知りました。 上記を参考にというよりは、上記をほとんど使わさせていただき、計算結果ファイルが欲しかったため、追記させていただきました。そして私の環境では文字コードのエラーが出てしまったため、頭にも魔法の言葉?を付けさせてもらいました。 "Ruby" # encoding: shift_JIS FILE_NAME = 'data.txt' OUT_COL_NAMES = '番号 合成速度' def calc(line) _, x, y, z = line.gsub(',', ' ').split.map { |s| s.to_f } result = Math.sqrt(x ** 2 + y ** 2 + z ** 2) end File.open(FILE_NAME, 'r') do |f| result = File.open('result.out', "w") f.each_line.with_index { |line, idx| out_line = idx.zero? ? OUT_COL_NAMES : "#{idx}#{sprintf('%10.2E', calc(line))}" puts out_line result.puts out_line } end "Ruby" 一応、結果が書き出せたのですが、あぶなそうであれば教えていただけると幸いです。
katoy

2017/04/03 21:44

> line.gsub(',', ' ').split これは、 line 中の すべての "," を " " に置き換えてから " " で区切るということをしています。
sakuya_izayoi

2017/04/03 22:55

ああ、そういう事なんですね。だからどちらでも大丈夫であるという事ですね。 ありがとうございました。ベストアンサーにさせていただきます。
guest

0

必要になりそうな処理だけ個別に記載します。

二乗

ruby

12 ** 2 # => 4

平方根

ruby

1Math.sqrt(2) # => 1.414213562373095

ファイルの読み取り

ruby

1File.open("test.txt", "r") do |f| 2 puts f.read 3end

投稿2017/04/03 10:56

tell_k

総合スコア2120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問