明けましておめでとうございます。
早速ですが、質問です。
私は、c言語の素人で素人ながら音声認証プログラムを作成しようと考えているのですが、
その際に、本人と他人を区別するための特徴量という数値として
39次元×5コくらいの数値の比較が必要なのです。
数値が上から39×5コが書かれたテキストファイルを出力することは出来るのですが、
肝心の比較計算が出来ずに困っています。
テキストファイルには、
1.418060e+00
-5.935938e-01
1.012918e+00
.
.
.
のように出力されています。
同様なテキストファイルがいくつかあり、それぞれの上から1番目同士、2番目同士・・・と比較し、
差を出力させたいのですが、出来ません。
テキスト比較や、一致などの方法は調べたのですが、数値の計算の方法はわかりませんでした。
どのようにしたら良いでしょうか?ご指南のほどお願いします。
テキストファイルの比較について
Re:テキストファイルの比較について
それなら、ここの龍神録の「敵出現データ」と同じような方法でできますね。文字列として読み込んで、atofもしくはstrtodを使う方法です。
ただ、「一行に浮動小数値が一つだけ」という仕様が保証されるなら、fscanfでも簡単に実装できます。
ポイントは「文字列を実数に変換する」という部分です。
数値を読み込んでしまえば、差は簡単に計算できますね。
ただ、「一行に浮動小数値が一つだけ」という仕様が保証されるなら、fscanfでも簡単に実装できます。
ポイントは「文字列を実数に変換する」という部分です。
数値を読み込んでしまえば、差は簡単に計算できますね。
Re:テキストファイルの比較について
C++でのやり方も書いておきます。
#include <iostream> #include <fstream> #include <algorithm> #include <functional> #include <iterator> #include <vector> int main() { std::vector<double> a, b; std::ifstream ifsa("a.txt"); std::ifstream ifsb("b.txt"); std::copy(std::istream_iterator<double>(ifsa), std::istream_iterator<double>(), std::back_inserter(a)); std::copy(std::istream_iterator<double>(ifsb), std::istream_iterator<double>(), std::back_inserter(b)); std::transform(a.begin(), a.end(), b.begin(), a.begin(), std::minus<double>()); std::copy(a.begin(), a.end(), std::ostream_iterator<double>(std::cout, "\n")); }ちょっと冗長なように見えますが、こうせざるを得ない理由があります。
Re:テキストファイルの比較について
lbfuvabさん
SCIさん
たかぎさん
解答どうもありがとうございました。
fscanfで試行錯誤してみます。
またつまづいたら質問したいと思いますのでよろしくお願いします。
SCIさん
たかぎさん
解答どうもありがとうございました。
fscanfで試行錯誤してみます。
またつまづいたら質問したいと思いますのでよろしくお願いします。