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

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

ただいまの
回答率

87.35%

CSVファイルに記録されている6行の加速度データを3行目から読み込みたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 509

score 6

ヘディングのテキスト### 前提・実現したいこと

java(eclipse)で
bluetooth接続の加速度センサーを用いて加速度をcsvファイルに記録し、そのデータをDTWを用いて、危険動作をしているかどうかを判定するプログラムを作成中です。

1、2行目のCSVファイルのデータは読み込み判定をするのですが、3~6行目のデータを読み込んで判定をすることが出来ずに、1,2行目のデータを複数回判定している状況です。

発生している問題・エラーメッセージ

波形を[ t_start=4, t_end=29, d_min=16.48 ]で検出しました。
波形を[ t_start=4, t_end=31, d_min=16.40 ]で検出しました。
波形を[ t_start=4, t_end=32, d_min=16.40 ]で検出しました。
波形を[ t_start=4, t_end=33, d_min=16.53 ]で検出しました。
波形を[ t_start=4, t_end=34, d_min=16.64 ]で検出しました。
波形を[ t_start=4, t_end=35, d_min=16.67 ]で検出しました。
波形を[ t_start=4, t_end=36, d_min=16.72 ]で検出しました。
波形を[ t_start=4, t_end=38, d_min=16.78 ]で検出しました。
波形を[ t_start=4, t_end=39, d_min=16.82 ]で検出しました。
波形を[ t_start=4, t_end=40, d_min=16.84 ]で検出しました。
波形を[ t_start=4, t_end=41, d_min=16.90 ]で検出しました。
波形を[ t_start=4, t_end=42, d_min=16.95 ]で検出しました。
波形を[ t_start=4, t_end=43, d_min=16.95 ]で検出しました。
波形を[ t_start=4, t_end=44, d_min=17.05 ]で検出しました。
波形を[ t_start=4, t_end=45, d_min=17.07 ]で検出しました。
波形を[ t_start=4, t_end=46, d_min=17.09 ]で検出しました。
波形を[ t_start=4, t_end=47, d_min=17.11 ]で検出しました。
波形を[ t_start=4, t_end=48, d_min=17.29 ]で検出しました。
波形を[ t_start=4, t_end=49, d_min=19.54 ]で検出しました。
波形を[ t_start=4, t_end=50, d_min=29.44 ]で検出しました。
波形を[ t_start=44, t_end=70, d_min=23.38 ]で検出しました。
波形を[ t_start=44, t_end=72, d_min=23.37 ]で検出しました。
波形を[ t_start=44, t_end=73, d_min=23.44 ]で検出しました。
波形を[ t_start=44, t_end=74, d_min=23.45 ]で検出しました。
波形を[ t_start=44, t_end=75, d_min=23.49 ]で検出しました。
波形を[ t_start=44, t_end=76, d_min=23.67 ]で検出しました。
波形を[ t_start=44, t_end=77, d_min=23.69 ]で検出しました。
波形を[ t_start=44, t_end=79, d_min=23.62 ]で検出しました。
波形を[ t_start=44, t_end=80, d_min=23.77 ]で検出しました。
波形を[ t_start=44, t_end=82, d_min=23.79 ]で検出しました。
波形を[ t_start=44, t_end=84, d_min=23.84 ]で検出しました。
波形を[ t_start=44, t_end=86, d_min=23.88 ]で検出しました。
波形を[ t_start=44, t_end=87, d_min=23.90 ]で検出しました。
波形を[ t_start=44, t_end=88, d_min=23.99 ]で検出しました。
波形を[ t_start=44, t_end=89, d_min=24.03 ]で検出しました。
波形を[ t_start=44, t_end=91, d_min=24.07 ]で検出しました。
波形を[ t_start=44, t_end=92, d_min=24.15 ]で検出しました。
波形を[ t_start=44, t_end=94, d_min=24.15 ]で検出しました。
波形を[ t_start=44, t_end=95, d_min=24.23 ]で検出しました。
波形を[ t_start=44, t_end=97, d_min=24.20 ]で検出しました。

該当のソースコード

package jp.kait.ic.tilab.posture;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class PostureDetect {
    public static final double dtwThresh = 30.0; // 閾値
    public static final double bigNumber = 10000.0;
    public static final double bigNumber2 = 10000.0;
    public static final double bigNumber3 = 10000.0;

    public static void main(String[] args) {
        // ファイル名
        String postureDat = "files/dat2Shag.csv"; // 判定対象データ

        // 変数
        List<Double> x = new ArrayList<Double>(); // ストリーム波形用
        List<Double> y = new ArrayList<Double>(); // 姿勢波形用
        List<Double> x2 = new ArrayList<Double>(); // ストリーム波形用
        List<Double> y2 = new ArrayList<Double>(); // 姿勢波形用
        List<Double> x3 = new ArrayList<Double>(); // ストリーム波形用
        List<Double> y3 = new ArrayList<Double>(); // 姿勢波形用

        // データ読み込み
        try{
            // ファイルの読みこみ
            FileReader fr = new FileReader(postureDat);
            BufferedReader br = new BufferedReader(fr);


            // 行ごと処理
            String line;
            /*Sring line2;
            String line3;*/
            StringTokenizer token;
            StringTokenizer token2;
            StringTokenizer token3;

             // ストリーム波形読み込み
            line = br.readLine();
            token = new StringTokenizer(line,",");
            while(token.hasMoreTokens()){
                x.add(Double.parseDouble(token.nextToken()));
                /*y2.add(Double.parseDouble(token.nextToken()));
                y3.add(Double.parseDouble(token.nextToken()));*/
            }

            token2 = new StringTokenizer(line,",");
            while(token2.hasMoreTokens()){
                x2.add(Double.parseDouble(token2.nextToken()));

            }
            token3 = new StringTokenizer(line,",");

            while(token3.hasMoreTokens()){
                x3.add(Double.parseDouble(token3.nextToken()));

            }

            // 姿勢波形読み込み
            line = br.readLine();
            token = new StringTokenizer(line,",");
            while(token.hasMoreTokens()){
                y.add(Double.parseDouble(token.nextToken()));
                /*x2.add(Double.parseDouble(token.nextToken()));
                x3.add(Double.parseDouble(token.nextToken()));*/
            }
            while(token2.hasMoreTokens()){
                y2.add(Double.parseDouble(token2.nextToken()));

        }
            while(token3.hasMoreTokens()){
        y3.add(Double.parseDouble(token3.nextToken()));
    }
            br.close();
        }catch (IOException ex){
            ex.printStackTrace();
        }

        // 姿勢判定
        // 変数初期化
        double d_min=bigNumber;
        double d_min2=bigNumber2;
        double d_min3=bigNumber3;// 最小値
        int t_start = 0; // 開始点
        int t_end = 0; // 終了点
        int t_start2 = 0; // 開始点
        int t_end2 = 0; // 終了点
        int t_start3 = 0; // 開始点
        int t_end3 = 0; // 終了点
        String tmpStr=""; // デバッグ用

        int lenX=x.size(); // ストリーム波形のサイズ 論文中t
        int lenY=y.size(); // 姿勢波形のサイズ 論文中m
        int lenX2=x2.size(); // ストリーム波形のサイズ 論文中t
        int lenY2=y2.size(); // 姿勢波形のサイズ 論文中m
        int lenX3=x3.size(); // ストリーム波形のサイズ 論文中t
        int lenY3=y3.size(); // 姿勢波形のサイズ 論文中m
        double[] d = new double[lenY+1];
        double[] d_dash = new double[lenY+1];
        int[] s = new int[lenY+1];
        int[] s_dash = new int[lenY+1];
        for(int i=1;i<lenY+1;i++)d[i] = bigNumber;
        for(int i=1;i<lenY+1;i++)d_dash[i] = bigNumber;
        d[0] = 0.0;
        d_dash[0] = 0.0;
        double[] d2 = new double[lenY2+1];
        double[] d_dash2 = new double[lenY2+1];
        int[] s2 = new int[lenY2+1];
        int[] s_dash2 = new int[lenY2+1];
        for(int i=1;i<lenY2+1;i++)d2[i] = bigNumber2;
        for(int i=1;i<lenY2+1;i++)d_dash2[i] = bigNumber2;
        d2[0] = 0.0;
        d_dash2[0] = 0.0;
        double[] d3 = new double[lenY3+1];
        double[] d_dash3 = new double[lenY3+1];
        int[] s3 = new int[lenY3+1];
        int[] s_dash3 = new int[lenY3+1];
        for(int i=1;i<lenY3+1;i++)d3[i] = bigNumber3;
        for(int i=1;i<lenY3+1;i++)d_dash3[i] = bigNumber3;
        d3[0] = 0.0;
        d_dash3[0] = 0.0;
        // 論文の添え字にあわせるため0追加
        x.add(0, 0.0);
        y.add(0, 0.0);
        x2.add(0, 0.0);
        y2.add(0, 0.0);
        x3.add(0, 0.0);
        y3.add(0, 0.0);

        for(int t=1;t<lenX+1;t++){
            s[0]=t;
            for(int i=1;i<lenY+1;i++){
                double[] d_best =new double[3];
                d_best[                                                                               0]=d[i-1];
                d_best[1]=d_dash[i];
                d_best[2]=d_dash[i-1];
                double min=bigNumber;
                for(int j=0;j<d_best.length;j++){ // 最も小さい値
                    min=Math.min(min, d_best[j]);
                }
                d[i] = Math.pow((double)x.get(t)-(double)y.get(i),2.0) +min;
                if(min==d_best[0])s[i]=s[i-1];
                else if(min==d_best[1])s[i]=s_dash[i];
                else s[i]=s_dash[i-1];
            }
            for(int m=1;m<lenX2+1;m++){
                s2[0]=m;
                for(int i=1;i<lenY2+1;i++){
                    double[] d_best2 =new double[3];
                    d_best2[0]=d2[i-1];
                    d_best2[1]=d_dash2[i];
                    d_best2[2]=d_dash2[i-1];
                    double min2=bigNumber2;
                    for(int j=0;j<d_best2.length;j++){ // 最も小さい値
                        min2=Math.min(min2, d_best2[j]);
                    }
                    d2[i] = Math.pow((double)x2.get(m)-(double)y2.get(i),2.0) +min2;
                    if(min2==d_best2[0])s2[i]=s2[i-1];
                    else if(min2==d_best2[1])s2[i]=s_dash2[i];
                    else s2[i]=s_dash2[i-1];
                }
            }
            for(int n=1;n<lenX3+1;n++){
                s3[0]=n;
                for(int i=1;i<lenY3+1;i++){
                    double[] d_best3 =new double[3];
                    d_best3[0]=d3[i-1];
                    d_best3[1]=d_dash3[i];
                    d_best3[2]=d_dash3[i-1];
                    double min3=bigNumber3;
                    for(int j=0;j<d_best3.length;j++){ // 最も小さい値
                        min3=Math.min(min3, d_best3[j]);
                    }
                    d3[i] = Math.pow((double)x3.get(n)-(double)y3.get(i),2.0) +min3;
                    if(min3==d_best3[0])s3[i]=s3[i-1];
                    else if(min3==d_best3[1])s3[i]=s_dash3[i];
                    else s3[i]=s_dash3[i-1];
                }
            }
            // SPRING-optimal case
            if(d_min<=dtwThresh){
                boolean waveComp=false;
                for(int i=1;i<lenY+1;i++){
                    if(d[i]>=d_min || s[i]>t_end)waveComp=true;
                    else waveComp=false;
                }
                if(waveComp){ // 同一波形発見
                    tmpStr="[ t_start="+t_start+", t_end="+t_end+", d_min="+String.format("%.2f", d_min)+" ]";
                    System.out.println("波形を"+tmpStr+"で検出しました。");
                    d_min=bigNumber;

                    }
                }
            if(d_min2<=dtwThresh){
                boolean waveComp2=false;
                for(int i=1;i<lenY2+1;i++){
                    if(d2[i]>=d_min2 || s2[i]>t_end2)waveComp2=true;
                    else waveComp2=false;
                }
                if(waveComp2){ // 同一波形発見
                    tmpStr="[ t_start="+t_start2+", t_end="+t_end2+", d_min="+String.format("%.2f", d_min2)+" ]";
                    System.out.println("2つめの波形を"+tmpStr+"で検出しました。");
                    d_min2=bigNumber2;

                    }
                if(d_min3<=dtwThresh){
                    boolean waveComp3=false;
                    for(int i=1;i<lenY3+1;i++){
                        if(d3[i]>=d_min3 || s3[i]>t_end3)waveComp3=true;
                        else waveComp3=false;
                    }
                    if(waveComp3){ // 同一波形発見
                        tmpStr="[ t_start="+t_start3+", t_end="+t_end3+", d_min="+String.format("%.2f", d_min3)+" ]";
                        System.out.println("3つめの波形を"+tmpStr+"で検出しました。");
                        d_min3=bigNumber3;

                    }
                }
            }

            if(d[lenY]<=dtwThresh && d[lenY]<d_min){
                d_min=d[lenY];
                t_start=s[lenY];
                t_end = t;
            }
            if(d2[lenY2]<=dtwThresh && d2[lenY2]<d_min2){
                d_min2=d2[lenY2];
                t_start2=s2[lenY2];
                t_end2 = t;
            }
            if(d3[lenY3]<=dtwThresh && d3[lenY3]<d_min3){
                d_min3=d3[lenY3];
                t_start3=s3[lenY3];
                t_end3 = t;
            }
            // substitute d' for d, s' for s
            for(int i=1;i<lenY+1;i++){
                d_dash[i] = d[i];
                s_dash[i] = s[i];
            }
            for(int i=1;i<lenY2+1;i++){
                d_dash2[i] = d2[i];
                s_dash2[i] = s2[i];
            }
            for(int i=1;i<lenY3+1;i++){
                d_dash3[i] = d3[i];
                s_dash3[i] = s3[i];
            }
        }
    }

}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

最初にreadlineを2回実行しといて(空読み)、CSVの読み込みを行えばいいのでは。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/23 12:14

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る