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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

5回答

2190閲覧

移動平均の誤差を失くし、直前の値がなぜか表示されてしまう動作を改善したい

wing

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/07/19 18:13

編集2021/07/29 17:49

前提・実現したいこと

移動平均を行うプログラムの制作して、実行させると誤差が出てしまうため、誤差をなくせるようにしたいこととそのプログラムの中で変数を宣言するとおかしな動作をしてしまうため解決したいです。
なお、移動平均の1~4回はdistanceの値をそのまま表示させたいと考えています。
5回目以降は移動平均を行いたいと考えており、0.12589...、0.14125…、0.11220…、0.1、0.112589と5つのdistanceの値をとり平均をと表示させ、データをずらして再計算したいと考えております。

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

「前提・実現したいこと」で書いたような数値の移動平均をとっています。5回目以降の最新のデータが0,125895の時は、0,1573656…となってしまいます。正しくは、0.125895…に近い値が表示されるようにしたいです。決して前後に飛びぬけている値があるとかではないです。
下記のソースのB2の距離の移動平均のソースの部分に「sum1=0」と値の合計を0にしている部分があるのですが、これを記載してしまうと、移動平均が実行されず直前の「distance2」の値がそのまま表示されてしまいます。

デバッグしてみた結果、3つある配列ma、ma1,ma2の中身、5つ全部がmaはdistance、ma1はdistance1、ma2はdistance2の値になっていました。同じ値を5回足して5で割っている状態でした。この配列が全部同じdistanceのように更新されていく値を保持するためにはどうすれば良いのでしょうか。自分でも調べたり、ほかの変数に格納して、実行してみたのですがうまくは行きませんでした。
何度も質問し、それに付き合っていただき誠にありがとうございます。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.UI; 6using Mathd; 7using System.Linq; 8 9public class Pointer : MonoBehaviour 10{ 11 12 //入る変数 13 GameObject iBeacon; 14 //取得したscriptが入る変数 15 Test001 script; 16 17 double speed = 2.0f; 18 /* 19 //研究室は縦8.5m、横10.5m 20 //Unityは10倍 21 //iBeacon[B1]の座標 22 Vector3 B1 = new Vector3(-52.5,0,42.5); 23 //iBeacon[B2]の座標 24 Vector3 B2 = new Vector3(52.5, 0, 42.5); 25 //iBeacon[B3]の座標 26 Vector3 B3 = new Vector3(0, 0, -42.5); 27 */ 28 29 30 //自宅は縦3m、横3.5m 31 //Unityは10倍 32 //iBeacon[B1]の座標 33 Vector3 B1 = new Vector3d(-15, 0, 17.5); 34 //iBeacon[B2]の座標 35 Vector3 B2 = new Vector3d(15, 0, 17.5); 36 //iBeacon[B3]の座標 37 Vector3 B3 = new Vector3d(0, 0, -17.5); 38 39 40 //RSSI 41 private int RSSI; 42 private int RSSI1; 43 private int RSSI2; 44 45 //TxPower 46 private int TxPower; 47 private int TxPower1; 48 private int TxPower2; 49 50 //distance 51 public double distance; 52 public double distance1; 53 public double distance2; 54 55 public static double Pow; 56 double Va, Vb, x, z, y; 57 //int cnt = 5; 58 59 double[] ma = new double[5]; 60 //double mat = 0; 61 double[] ma1 = new double[5]; 62 double sum1 = 0; 63 //double t1 = 0; 64 65 double[] ma2 = new double[5]; 66 double sum2 = 0; 67 //double t2 = 0; 68 69 public Text textUI; 70 public Text textUUI; 71 public Text textUUUI; 72 73 Vector3d Basepoint; 74 public static int count; 75 int a; 76 int b = 2; 77 // Start is called before the first frame update 78 void Start() 79 { 80 iBeacon = GameObject.Find("IBeacon"); 81 script = iBeacon.GetComponent<Test001>(); 82 count = 0; 83 84 //RSSI持ってくるかも 85 RSSI = script.total; 86 RSSI1 = script.total1; 87 RSSI2 = script.total2; 88 89 TxPower = script.Strength; 90 TxPower1 = script.Strength1; 91 TxPower2 = script.Strength2; 92 a = 1; 93 //iBeaconMath(); 94 b = 1; 95 96 //現在地取得かも~~ 97 //transform.position = new Vector3d(x, 0.5, z); 98 99 } 100 101 // Update is called once per frame 102 void Update() 103 { 104 105 double step = speed * Time.deltaTime; 106 107 //RSSI持ってくるかも 108 RSSI = script.total; 109 RSSI1 = script.total1; 110 RSSI2 = script.total2; 111 112 TxPower = script.Strength; 113 TxPower1 = script.Strength1; 114 TxPower2 = script.Strength2; 115 116 IBeaconMath(); 117 //int c = 1; 118 119 /* 120 Vector3 devicepoint = new Vector3d(x, 0.5, z); 121 if(count == 0) 122 { 123 Basepoint = devicepoint; 124 count = 1; 125 } 126 127 transform.position = Vector3d.MoveTowards(Basepoint, devicepoint, step); 128 double tmpX = x; 129 double tmpZ = z; 130 Basepoint = new Vector3d(tmpX, 0.5, tmpZ); 131 */ 132 133 } 134 135 private void IBeaconMath() 136 { 137 138 139 int d = 0; 140 //B1の距離の移動平均 141 distance = Math.Pow(10.0, (TxPower - RSSI) / 20.0); 142 int h = 1; 143 144 int l = 1; 145 double mat = 0; 146 for(int j=0; j<5; j++) 147 { 148 149 mat += ma[j]; 150 } 151 int e = 1; 152 mat /= 5; 153 154 int f = 1; 155 for (int j=1; j<5; j++) 156 { 157 //mat = 0; 158 ma[j] = ma[j - 1]; 159 160 } 161 ma[0] = distance; 162 int g = 1; 163 164 //double result; 165 //result = t - distance; 166 167 168 //B2の距離の移動平均 169 distance1 = Math.Pow(10.0, (TxPower1 - RSSI1) / 20.0); 170 //sum1=0; 171 for (int i = 0; i < 5; i++) 172 { 173 174 sum1 += ma1[i]; 175 } 176 177 sum1 /= 5; 178 179 for (int i=4; i>0; i--) 180 { 181 ma1[i] = ma1[i - 1]; 182 } 183 184 ma1[0] = distance1; 185 186 187 //B3の距離の移動平均 188 distance2 = Math.Pow(10.0, (TxPower2 - RSSI2) / 20.0); 189 //sum2 = 0; 190 for (int k = 0; k < 5; k++) 191 { 192 sum2 += ma2[k]; 193 } 194 195 sum2 /= 5; 196 197 //sum2 /= 5; 198 for (int k = 4; k > 0; k--) 199 { 200 ma2[k] = ma2[k - 1]; 201 } 202 ma2[0] = distance2; 203 204 textUI.text = "B1との距離" + distance.ToString() + "m" + "\nB2との距離" + distance1.ToString() + "m" + "\nB3との距離" + distance2.ToString() + "m" + "\nB1のRSSI" + RSSI.ToString()+"db"+"\nB2のRSSI"+RSSI1.ToString()+"db"+ "\nB3のRSSI" + RSSI2.ToString() + "db"; 205 textUUI.text = "B1とのma距離" + mat.ToString() + "m" + "\nB2とのma距離" + sum1.ToString() + "m" + "\nB3とのma距離" + sum2.ToString() + "m"; 206 textUUUI.text = d.ToString() + h.ToString() + l.ToString() + e.ToString() + f.ToString() + g.ToString(); 207 208 /* 209 Va = ((Math.Pow(t1, 2) - Math.Pow(t2, 2)) - (Math.Pow(B2.x, 2) - Math.Pow(B3.x, 2)) - (Math.Pow(B2.z, 2) - Math.Pow(B3.z, 2))) / 2; 210 Vb = ((Math.Pow(t1, 2) - Math.Pow(t, 2)) - (Math.Pow(B2.x, 2) - Math.Pow(B1.x, 2)) - (Math.Pow(B2.z, 2) - Math.Pow(B1.z, 2))) / 2; 211 212 z = (Vb * (B3.x - B2.x) - Va * (B1.x - B2.x)) / ((B1.z - B2.z) * (B3.x - B2.x) - (B3.z - B2.z) * (B1.x - B2.x)); 213 x = (Va - z * (B3.z - B2.z)) / (B3.x - B2.x); 214 */ 215 216 217 218 219 220 221 222} 223

試したこと

自分が分かる範囲でソースを見直した
移動平均のソースを調べた。

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

C#
Unity2019.4.15f
visual stdio 2015

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

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

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

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

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

YAmaGNZ

2021/07/20 05:35

何故デバッグしないのですか?
YAmaGNZ

2021/07/29 22:17 編集

>3つある配列ma、ma1,ma2の中身、5つ全部がmaはdistance、ma1はdistance1、ma2はdistance2の値になっていました とのことですが、現在提示しているソースコードでの話ですか? もし異なるのであればそれを提示してください。 複数回呼ぶような処理ですから、 1回目のTxPower、RSSI、結果(各変数の値) 2回目のTxPower、RSSI、結果(各変数の値) といった感じで具体的な値を提示できませんか?
wing

2021/07/30 01:50

現在提示しているソースです。
YAmaGNZ

2021/07/30 01:52

では入力の値は?
wing

2021/07/30 02:58

B1,B2,のTxPowerは常時-75です B1は 1回目 RSSI:-85 distance 3.16227766016838 2回目 RSSI:-81 distance 1.99526231496888 3回目 RSSI: -86 distance 3.54813389233576 4回目 RSSI:-82   distance 2.23872113856834 5回目 RSSI:-82  distance 2.23872113856834 B2は 1回目 RSSI:-74 distance1:0.891250938133746 2回目 RSSI:-72  distance1:0.707945784384138 3回目 RSSI:-79 distance1 : 1.58489319246111 4回目 RSSI:-81 distance1:1.99526231496888 5回目 RSSI:-84  distance1:2.81838293126445 B3 1回目 RSSI:-82 distance2 2.23872113856834 2回目 RSSI:-84  distance2 2.81838293126445 3回目 RSSI:-82 distance2 2.23872113856834 4回目 RSSI: -83 distance2 3.54813389233576 5回目 RSSI:-82   distance2 2.23872113856834 5回目 RSSI:-81  distance2 1.99526231496888
guest

回答5

0

C#

1 //B1の距離の移動平均 2 distance = Math.Pow(10.0, (TxPower - RSSI) / 20.0); 3 4 for(int j=0; j<5; j++) 5 { 6 mat += ma[j]; 7 } 8 9 mat /= 5; 10 11 12 for (int j=4; j>0; j--) 13 { 14 ma[j] = ma[j - 1]; 15 } 16 ma[0] = distance; 17

今回求めたdistanceは平均に含まれませんがいいのですか?
この関数が呼ばれた回数が1~4回目は値が1~4個しかないのに5で割って明らかに平均じゃありませんがいいのですか?

こういったことが関係なく値がおかしいといわれるのであれば、入力値と出力値とご自身で正しいと思われる値を記載してください。

また、固定長の配列を使うよりList<T>を使用したほうがコードがすっきりするかと思います。

追記

C#

1 //sum1=0; 2 for (int i = 0; i < 5; i++) 3 { 4 sum1 += ma1[i]; 5 } 6 sum1 /= 5; 7 8 for (int i=4; i>0; i--) 9 { 10 ma1[i] = ma1[i - 1]; 11 } 12 ma1[0] = distance1;

この部分がどう動いているか
distance1は仮定の値、ma1の値はsum1を計算するときの値とします。

回数distance1ma1[0]ma1[1]ma1[2]ma1[3]ma1[4]sum1
11000000
22100000.2
33210000.64

sum1は(sum1+ma1[0]+ma1[1]+ma1[2]+ma1[3]+ma1[4])/5となっています。
なので3回目は2回目で求めた平均の0.2にma1の合計の3が加算され3.2/5という計算になっています。
また、求めたい平均は1回目から1、1.5、2となるのではないですか?


さらに追記

2021/07/30 02:49編集時点でのソースでの検証です。

B1計算部分の動作は以下のようになります。

1回目 入力値 RSSI = -85 : TxPower = -75 distance = 3.16227766016838 配列の和を求める部分 ma[0]=0 : ma[1]=0 : ma[2]=0 : ma[3]=0 : ma[4]=0 mat = 0 : (参考)配列の合計=0 平均を計算 (mat / 5) mat = 0 配列をシフト後 ma[0]=3.16227766016838 : ma[1]=0 : ma[2]=0 : ma[3]=0 : ma[4]=0 2回目 入力値 RSSI = -81 : TxPower = -75 distance = 1.99526231496888 配列の和を求める部分 ma[0]=3.16227766016838 : ma[1]=0 : ma[2]=0 : ma[3]=0 : ma[4]=0 mat = 3.16227766016838 : (参考)配列の合計=3.16227766016838 平均を計算 (mat / 5) mat = 0.632455532033676 配列をシフト後 ma[0]=1.99526231496888 : ma[1]=3.16227766016838 : ma[2]=3.16227766016838 : ma[3]=3.16227766016838 : ma[4]=3.16227766016838 3回目 入力値 RSSI = -86 : TxPower = -75 distance = 3.54813389233576 配列の和を求める部分 ma[0]=1.99526231496888 : ma[1]=3.16227766016838 : ma[2]=3.16227766016838 : ma[3]=3.16227766016838 : ma[4]=3.16227766016838 mat = 14.6443729556424 : (参考)配列の合計=14.6443729556424 平均を計算 (mat / 5) mat = 2.92887459112848 配列をシフト後 ma[0]=3.54813389233576 : ma[1]=1.99526231496888 : ma[2]=1.99526231496888 : ma[3]=1.99526231496888 : ma[4]=1.99526231496888 4回目 入力値 RSSI = -82 : TxPower = -75 distance = 2.23872113856834 配列の和を求める部分 ma[0]=3.54813389233576 : ma[1]=1.99526231496888 : ma[2]=1.99526231496888 : ma[3]=1.99526231496888 : ma[4]=1.99526231496888 mat = 11.5291831522113 : (参考)配列の合計=11.5291831522113 平均を計算 (mat / 5) mat = 2.30583663044225 配列をシフト後 ma[0]=2.23872113856834 : ma[1]=3.54813389233576 : ma[2]=3.54813389233576 : ma[3]=3.54813389233576 : ma[4]=3.54813389233576 5回目 入力値 RSSI = -82 : TxPower = -75 distance = 2.23872113856834 配列の和を求める部分 ma[0]=2.23872113856834 : ma[1]=3.54813389233576 : ma[2]=3.54813389233576 : ma[3]=3.54813389233576 : ma[4]=3.54813389233576 mat = 16.4312567079114 : (参考)配列の合計=16.4312567079114 平均を計算 (mat / 5) mat = 3.28625134158227 配列をシフト後 ma[0]=2.23872113856834 : ma[1]=2.23872113856834 : ma[2]=2.23872113856834 : ma[3]=2.23872113856834 : ma[4]=2.23872113856834

配列のシフト処理がおかしいので配列の値が正しくありません。
2021/07/21 20:31のコメントにて
B1のバッファ処理がおかしいので2回目以降の値がおかしくなります。(前回のソースだとここは正しかったはず)
と指摘している内容です。

平均を求める部分に関してはmatはローカル変数として定義され毎回0からの加算となるので
平均の計算自体は正常に計算されます。
(今回求めたdistanceが平均に含まれないのは前から疑問として投げかけた部分なので無視)

B2計算部分の動作は以下のようになります。(B3も同じなので省略します)

1回目 入力値 RSSI = -74 : TxPower = -75 distance1 = 0.891250938133746 配列の和を求める部分 ma1[0]=0 : ma1[1]=0 : ma1[2]=0 : ma1[3]=0 : ma1[4]=0 sum1 = 0 : (参考)配列の合計=0 平均を計算 (sum1 / 5) sum1 = 0 配列をシフト後 ma1[0]=0.891250938133746 : ma1[1]=0 : ma1[2]=0 : ma1[3]=0 : ma1[4]=0 2回目 入力値 RSSI = -72 : TxPower = -75 distance1 = 0.707945784384138 配列の和を求める部分 ma1[0]=0.891250938133746 : ma1[1]=0 : ma1[2]=0 : ma1[3]=0 : ma1[4]=0 sum1 = 0.891250938133746 : (参考)配列の合計=0.891250938133746 平均を計算 (sum1 / 5) sum1 = 0.178250187626749 配列をシフト後 ma1[0]=0.707945784384138 : ma1[1]=0.891250938133746 : ma1[2]=0 : ma1[3]=0 : ma1[4]=0 3回目 入力値 RSSI = -79 : TxPower = -75 distance1 = 1.58489319246111 配列の和を求める部分 ma1[0]=0.707945784384138 : ma1[1]=0.891250938133746 : ma1[2]=0 : ma1[3]=0 : ma1[4]=0 sum1 = 1.77744691014463 : (参考)配列の合計=1.59919672251788 平均を計算 (sum1 / 5) sum1 = 0.355489382028926 配列をシフト後 ma1[0]=1.58489319246111 : ma1[1]=0.707945784384138 : ma1[2]=0.891250938133746 : ma1[3]=0 : ma1[4]=0 4回目 入力値 RSSI = -81 : TxPower = -75 distance1 = 1.99526231496888 配列の和を求める部分 ma1[0]=1.58489319246111 : ma1[1]=0.707945784384138 : ma1[2]=0.891250938133746 : ma1[3]=0 : ma1[4]=0 sum1 = 3.53957929700792 : (参考)配列の合計=3.184089914979 平均を計算 (sum1 / 5) sum1 = 0.707915859401585 配列をシフト後 ma1[0]=1.99526231496888 : ma1[1]=1.58489319246111 : ma1[2]=0.707945784384138 : ma1[3]=0.891250938133746 : ma1[4]=0 5回目 入力値 RSSI = -84 : TxPower = -75 distance1 = 2.81838293126445 配列の和を求める部分 ma1[0]=1.99526231496888 : ma1[1]=1.58489319246111 : ma1[2]=0.707945784384138 : ma1[3]=0.891250938133746 : ma1[4]=0 sum1 = 5.88726808934946 : (参考)配列の合計=5.17935222994788 平均を計算 (sum1 / 5) sum1 = 1.17745361786989 配列をシフト後 ma1[0]=2.81838293126445 : ma1[1]=1.99526231496888 : ma1[2]=1.58489319246111 : ma1[3]=0.707945784384138 : ma1[4]=0.891250938133746

B1の動作と違い配列のシフト処理は正常に動作します。
しかし、sum1のクリアが無いため、平均を正常に求めることが出来ません。
これは2021/07/25 10:16に回答に追記した部分で指摘しています。

例)
3回目の計算の場合、配列の合計値は1.59919672251788となります。
しかし、平均を求めるためのsum1は前回計算で求めたsum1の0.178250187626749+配列合計の1.59919672251788の1.77744691014463となってしまっています。

また、質問を編集されて追記された

デバッグしてみた結果、3つある配列ma、ma1,ma2の中身、5つ全部がmaはdistance、ma1はdistance1、ma2はdistance2の値になっていました。同じ値を5回足して5で割っている状態でした。

という現象は見受けられません。

投稿2021/07/20 07:09

編集2021/07/30 08:34
YAmaGNZ

総合スコア10294

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

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

wing

2021/07/20 16:54

distanceは、Txpowerが-75、RSSIが-54なら距離が0.089・・・となり、この値に近いものが連続して入力され、移動平均で0.08•••に近い値が出力さてほしいです。しかし現在は、0.1114と出力されています。 1~4回目の処理は移動平均がうまく出力されてから追加したいと考えています。
YAmaGNZ

2021/07/20 22:34

その説明では不十分です。 私の指摘した問題点に関してはどうなのでしょうか? 1つ目の「今回求めたdistanceは平均に含まれませんがいいのですか?」に関しては 1回目に呼ばれた場合、distanceを求めているが平均計算には利用していない為、平均は0となりますがこれでいいのですか? 2つ目の「この関数が呼ばれた回数が1~4回目は値が1~4個しかないのに5で割って」に関しては 1回目のdistanceが1,2回目のdistanceが2だった場合、maの合計値は3でそれを5で割っていることになります。 平均を求めるのであれば2つの値なので3/2となるはずです。 これらは私の指摘は的外れでプログラムは仕様通りに作成されているということなのですか? 私の指摘が違うのであれば具体的に TxPower、RSSI、distance、ma[0]、ma[1]、ma[2]、ma[3]、ma[4]、mat の値を1回目に呼んだとき、2回目に呼んだときといった感じで実際にプログラムを動作させたときの値を確認して提示してください。 そしてその値から例えば「X回目のmatの値が0.~となっているが、正しくは0.~となって欲しい」とか具体的に問題点を提示してください。
YAmaGNZ

2021/07/21 01:05 編集

他にもB3の計算部分でif文ではtを使っているのにインクリメントしているのはt2であったりとおかしいのでは?といった部分がありますし、変数定義部分も書いていないので変数スコープが正しいのかも分かりません。 こういったことはデバッガでステップ実行したり、どのように動いているのかDebug.Logを入れたりすれば分かることです。 なので私は厳しく「デバッグしないのですか?」とお聞きしました。
wing

2021/07/21 10:24

非常に分かりずらいソースコードで、すいませんでした。 Android端末で行っているため、どこまでプログラムが動いているか確認するために、自分で決めたわかりやすい変数を置いてそれをテキスト表示されるようにしています。 疑問にお答えできるように説明を追加しました。
YAmaGNZ

2021/07/21 11:31

正確な値は実機ではないと得られないでしょうが、ロジックテストなのですから実機でなくても適当な値でPC上で動作させてテストできるはずです。 で、現状で提示されているソースを動かした結果 B1のバッファ処理がおかしいので2回目以降の値がおかしくなります。(前回のソースだとここは正しかったはず) B2、B3に関してはsum1とsum2はクリアされずに合計され続けるので計算結果が正しくありません。 私は実機を持っていないので当然実際のTxPowerやRSSIの値は得られませんが、TxPower=-75、RSSI=-54と一定の値を入力して複数回実行するだけでこれだけ分かります。
guest

0

自己解決

C#

1 if (Math.Abs(distance1 - tmp[1]) > 0) 2 { 3 sum1 = 0; 4 5 total[1] = 0; 6 //3つの配列足す 7 for (int j = 0; j < 3; j++) 8 { 9 sum1 += ma1[j]; 10 } 11 12 //配列をずらす 13 for (int j = 2; j > 0; j--) 14 { 15 ma1[j] = ma1[j - 1]; 16 17 } 18 //最新の値を入れる 19 tmp[1] = distance1; 20 ma1[0] = distance1; 21 count[1]++; 22 23 if (count[1] == 1) 24 { 25 total[1] = distance1; 26 } 27 28 else if (count[1] < 3) 29 { 30 total[1] = sum1 / (count[1] - 1); 31 } 32 33 else 34 { 35 total[1] = sum1 / 3; 36 } 37 }

投稿2021/08/04 06:42

wing

総合スコア20

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

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

YAmaGNZ

2021/08/04 07:17 編集

平均を取るってことは1回の測定だと誤差が大きいから何回かの平均をとってなるべく正確な距離としましょうってことだと思うのですが、同一値が続いた時無視していいのですか? 測定距離が1,1,2となった場合、1と測定した回数が多いのだから実際の距離は1に近いと考えるべきで実際平均値は1.33となる。貴方の考えだと1.5となりより誤差が大きくなると思います。 さらに1,1,2って計測と1,2,1って計測で結果が変わるって話にもなります。 まぁその仕様でいいって話なら忘れてください。
guest

0

移動平均を求める箇所が3つもあるのですから共通化しましょう。
同じところに3つも書いてあるのでミスが仮にあっても分かりづらいですし、
好きな値を入れて動作を検証するということもできなくなっています。

こんな感じ:

C#

1public class MovingAverage{ 2 private uint length; 3 private uint validLength = 0; 4 private uint writePointer = 0; 5 private double[] arr; 6 public MovingAverage(uint length){ 7 this.length = length; 8 this.arr = new double[length]; 9 } 10 11 public void Push(double x){ 12 this.arr[writePointer++] = x; 13 writePointer %= length; 14 validLength = validLength < length ? validLength+1 : length; 15 } 16 17 public double Value { 18 get{ 19 return arr.Sum()/validLength; 20 } 21 } 22 23}

投稿2021/07/21 01:18

編集2021/07/21 01:19
ozwk

総合スコア13532

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

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

fana

2021/07/21 01:59

原因究明の前にこのように変更してしまうと > B2の距離の移動平均のソースの部分に「sum1=0」と値の合計を0にしている部分があるのですが、これを記載してしまうと、移動平均が実行されず直前の「distance2」の値がそのまま表示されてしまいます。 という不思議な(sum1とdistance2とは別の移動平均に関わるものなのに互いに謎の作用を生じるという)話自体が消え失せてしまいそうなので, 現状の謎動作の原因を把握してから→このようにする と良いのかな,と.
wing

2021/07/21 06:56

ありがとうございます!
wing

2021/07/21 09:59

もし、これを導入する場合、複数あるdistanceをどのように組み込めばよいのでしょうか。
ozwk

2021/07/21 10:46 編集

複数インスタンスを作ってください 何言ってるかわからないならC#の入門書か何か読んでください
wing

2021/07/24 17:58

プログラムの解説を頂いてもよろしいでしょうか。 lengthとvaildlengthとwritepointerがなにをさしているのか教えていただきたいです。
ozwk

2021/07/24 23:08

lengthはarrの長さ validLengthは有効なデータ数 writePointerは次に配列のどこに書くか
wing

2021/07/25 18:39

ありがとうございます
guest

0

こちらのfor文は 0,1,2,3,4 計5回繰り返されますが

csharp

1//B3の距離の移動平均 2distance2 = Math.Pow(10.0, (TxPower2 - RSSI2) / 20.0); 3for (int k = 0; k < 5; k++) 4{ 5 t2 += 1; 6 sum2 += ma2[k]; 7}

その後のfor文 4,3,2,1 計4回しか繰り返されません

csharp

1//sum2 /= 5; 2for (int k = 4; k > 0; k--) 3{ 4 ma2[k] = ma2[k - 1]; 5} 6ma2[0] = distance2; 7

平均値がずれているのはそのためではないでしょうか?

投稿2021/07/19 23:24

odataiki

総合スコア948

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

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

wing

2021/07/20 05:28

最初に0~4を足して、それを5で割り、1〜4をずらして、0に新しい値を入れるようにしています
odataiki

2021/07/20 09:04

なるほど。そういうことでしたか。 ちなみに開示頂いているコードは変数宣言がなかったりしてますので 一部抜粋されているのでしょうか? 色々ご都合もあるでしょうが、現状開示頂いたコードですと私の環境ではビルドも通らないため 検証が出来ません。 ブレークポイントを使って1つずつ手動計算していくのが良いのではないでしょうか?
wing

2021/07/21 10:25

一部を抜粋しております。
guest

0

for(int j=0; j<5; j++) { mat += ma[j]; }

まず、matが初期化されてません

for (int k = 0; k < 5; k++) { t2 += 1; sum2 += ma2[k]; }

これも同様

投稿2021/07/19 22:57

編集2021/07/19 23:01
y_waiwai

総合スコア87800

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

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

wing

2021/07/20 16:42 編集

初期化すると直前のdistanceの値にになってしまいます
y_waiwai

2021/07/20 07:11

ちと意味不明ですが、 初期化しとかないと積算値がむちゃぐちゃになりますよ
wing

2021/07/21 10:27

分かりにくくてすいません。 説明しなおすと、直前のソースコードのdistanceの計算結果と同じものが移動平均の計算結果として表示されてしまいます。
y_waiwai

2021/07/21 10:47

Update関数中では読み出し行ってないじゃないですか。 なにやってんだか。 常に同じ値でループ回してるだけだから同じ値が出てくるのは当たり前ですがな
wing

2021/07/21 11:13

失礼を承知でお伺いします。自分の知識不足ですいません。関数中で読み出しを行なっていないとはどういうことなのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問