C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

このエラーを解消したいです。 /みか (24/01/18(Thu) 23:40) #102868
Re[1]: このエラーを解消したいです。 /くま (24/01/19(Fri) 01:24) #102869
│└ Re[2]: このエラーを解消したいです。 /魔界の仮面弁士 (24/01/19(Fri) 08:04) #102870
│  └ Re[3]: このエラーを解消したいです。 /みか (24/01/19(Fri) 23:21) #102875
│    ├ Re[4]: このエラーを解消したいです。 /shu (24/01/21(Sun) 19:49) #102876
│    └ Re[4]: このエラーを解消したいです。 /kiku (24/01/22(Mon) 15:10) #102879
│      └ Re[5]: このエラーを解消したいです。 /kiku (24/01/22(Mon) 15:44) #102880
│        └ Re[6]: このエラーを解消したいです。 /みか (24/01/23(Tue) 18:34) #102885
│          └ Re[7]: このエラーを解消したいです。 /kiku (24/01/24(Wed) 10:20) #102887
│            └ Re[8]: このエラーを解消したいです。 /みか (24/01/25(Thu) 23:30) #102891
│              └ Re[9]: このエラーを解消したいです。 /kiku (24/01/26(Fri) 08:39) #102892
│                └ Re[10]: このエラーを解消したいです。 /みか (24/01/26(Fri) 21:15) #102900
│                  └ Re[11]: このエラーを解消したいです。 /kiku (24/01/29(Mon) 08:47) #102904
│                    └ Re[12]: このエラーを解消したいです。 /kiku (24/01/29(Mon) 13:18) #102905
Re[1]: このエラーを解消したいです。 /みか (24/02/01(Thu) 21:08) #102918
  ├ Re[2]: このエラーを解消したいです。 /ビール呑み (24/02/02(Fri) 03:42) #102919
  │└ Re[3]: このエラーを解消したいです。 /みか (24/02/02(Fri) 20:08) #102921
  └ Re[2]: このエラーを解消したいです。 /kiku (24/02/02(Fri) 10:22) #102920
    └ Re[3]: このエラーを解消したいです。 /みか (24/02/02(Fri) 20:39) #102922
      ├ Re[4]: このエラーを解消したいです。 /ビール呑み (24/02/02(Fri) 21:29) #102923
      │└ Re[5]: このエラーを解消したいです。 /みか (24/02/03(Sat) 21:44) #102924
      └ Re[4]: このエラーを解消したいです。 /kiku (24/02/05(Mon) 09:17) #102925
        └ Re[5]: このエラーを解消したいです。 /kiku (24/02/05(Mon) 10:42) #102926
          └ Re[6]: このエラーを解消したいです。 /みか (24/02/05(Mon) 20:14) #102930
            └ Re[7]: このエラーを解消したいです。 /kiku (24/02/06(Tue) 08:44) #102932
              └ Re[8]: このエラーを解消したいです。 /kiku (24/02/06(Tue) 10:04) #102934
                └ Re[9]: このエラーを解消したいです。 /みか (24/02/06(Tue) 22:41) #102940 解決済み
                  └ Re[10]: このエラーを解消したいです。 /kiku (24/02/07(Wed) 13:46) #102941 解決済み
                    └ Re[11]: このエラーを解消したいです。 /みか (24/02/07(Wed) 19:38) #102943 解決済み


親記事 / ▼[ 102869 ] ▼[ 102918 ]
■102868 / 親階層)  このエラーを解消したいです。
□投稿者/ みか (1回)-(2024/01/18(Thu) 23:40:41)

分類:[VB.NET/VB2005 以降] 

Dim y() As Double
Dim N As Integer = 5
Dim M As Integer = 2
Dim result As Double

  result = SGFilter(y(), N, M) 'resultに「エラーBC30188宣言が必要です。」が出ます。

Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
End Function
[ □ Tree ] 返信 編集キー/

▲[ 102868 ] / ▼[ 102870 ]
■102869 / 1階層)  Re[1]: このエラーを解消したいです。
□投稿者/ くま (22回)-(2024/01/19(Fri) 01:24:06)
No102868 (みか さん) に返信
> Dim result As Double
> 
>   result = SGFilter(y(), N, M) 'resultに「エラーBC30188宣言が必要です。」が出ます。
> 
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()

落ち着いて見てみましょう。
resultでエラーになっているので、関数「SGFilter」の戻り値の問題ですよね?
関数「SGFilter」の戻り値は「Double()」配列指定ですね。
受け取る側の変数resultは「Double」単一指定ですね。
どちらかに揃えてあげましょう。

参考までに
http://hachisue.blog65.fc2.com/blog-entry-170.html

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102869 ] / ▼[ 102875 ]
■102870 / 2階層)  Re[2]: このエラーを解消したいです。
□投稿者/ 魔界の仮面弁士 (3746回)-(2024/01/19(Fri) 08:04:19)
No102869 (くま さん) に返信
> ■No102868 (みか さん) に返信
> resultでエラーになっているので、関数「SGFilter」の戻り値の問題ですよね?
> 関数「SGFilter」の戻り値は「Double()」配列指定ですね。
> 受け取る側の変数resultは「Double」単一指定ですね。
> どちらかに揃えてあげましょう。

うーん。確かにそれもあるんですが、今回の本質は、もっと根本的なミスに見えます。


現在のエラー「BC30188 宣言が必要です。」が生じるケースというのは、
SGFilter の呼び出し処理を、メソッドの外側で行おうとしているような場合です。
つまり、Module や Class の直下に記述されている状況ですね。


エラー BC30188 が示す「宣言」というのは、SGFilter の呼び出しが、
変数宣言と同時に(変数の初期化子として)受け渡そうとしている構文とみなされるものの、
その行の result が変数宣言の形式になっていないという事を意味します。

Module や Class の直下で呼び出すのであれば、「Dim result As Double」の行は削って、
その後に書かれた
 result = SGFilter(……)
の部分を、
 Private result As Double() = SGFilter(……)
あるいは
 Dim result As Double() = SGFilter(……)
といった記法にすることが要求されます。


ただしおそらくは、そもそもメソッドの外側で呼び出そうとしていること自体が実装ミスでしょう。
今回のケースでは、result = SGFilter(……) な呼び出しを、何らかのメソッドの中に移動させるべきです。
――たとえば Sub Main() や Sub Button1_Click(sender As Object, e As EventArgs) の中に。

※ちなみに、Module や Class の外側に書いた場合は、別のエラー(BC30689)になります。

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/error-messages/declaration-expected
https://learn.microsoft.com/ja-jp/dotnet/visual-basic/misc/bc30689


そして、呼び出し部をメソッド内に移動したとしても、くまさんが指摘された点を直さないと、
「BC30311 型 'Double()' の値を 'Double' に変換できません。」になってしまいます。


さらに加えて、元のコードにはもうひとつ文法違反があります。
このケースでは、
 result = SGFilter(y(), N, M)
ではなく、
 result = SGFilter(y, N, M)
と書かねばならない、ということです。前者のままだと、result を Double() 型にしたとしても、
「BC30105 インデックスの数がインデックス付き配列の次元数より少ない値です。」に陥ってしまうことでしょう。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102870 ] / ▼[ 102876 ] ▼[ 102879 ]
■102875 / 3階層)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (2回)-(2024/01/19(Fri) 23:21:12)
2024/01/20(Sat) 22:15:44 編集(投稿者)
No102869 (くま さん) に返信
■No102870 (魔界の仮面弁士 さん) に返信

あちこちから引っ張って来てつくりました。
何も分かっていません。
身の程知らずですみません。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y() As Double            'データが入る配列
        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result As Double
        result = SGFilter(y(), N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k
                sum = sum + w(N + j, 0)
            Next j
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = w(N + j, k) / sum
                Next k
            Next j
            For j = -N To N
                sum = 0
                For k = 0 To M
                    sum = sum + w(N + j, k) * y(i + j)
                Next k
                y2(i) = y2(i) + sum
            Next j
        Next i
        SGFilter = y2
    End Function


[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102875 ] / 返信無し
■102876 / 4階層)  Re[4]: このエラーを解消したいです。
□投稿者/ shu (1回)-(2024/01/21(Sun) 19:49:31)
>
> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> Dim y() As Double       'データが入る配列
> Dim N As Integer = 5
> Dim M As Integer = 2
> Dim result As Double


ここまでにyの配列に値を設定する処理が入る?

> result = SGFilter(y(), N, M)
result = SGFilter(y, N, M) ※既出の回答通り多分これ

> End Sub
>
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
> Dim i As Integer, j As Integer, k As Integer
> Dim w(0 To N, 0 To M) As Double
> Dim sum As Double
> Dim y2() As Double
>
> ReDim y2(0 To UBound(y))
下でいきなり足し算を行っているでのy2の中身を初期化する処理があった方がよい

>
> For i = 0 To UBound(y)
> sum = 0
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = ((j + k) ^ (2 * M))
> Next k
> sum = sum + w(N + j, 0)
> Next j
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = w(N + j, k) / sum
> Next k
> Next j
※1
> For j = -N To N
> sum = 0
y2(i)がこのループで変動しない為※1に移動した方がよい

> For k = 0 To M
> sum = sum + w(N + j, k) * y(i + j)
※i+jがyのインデックス最大値を超える為エラーとなる。ifなどでインデックスチェックが必要

> Next k
> y2(i) = y2(i) + sum
y2(i)がこのループで変動しない為※2に移動した方がよい

> Next j
※2

> Next i
> SGFilter = y2
> End Function
>
>
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102875 ] / ▼[ 102880 ]
■102879 / 4階層)  Re[4]: このエラーを解消したいです。
□投稿者/ kiku (398回)-(2024/01/22(Mon) 15:10:45)
No102875 (みか さん) に返信
> 2024/01/20(Sat) 22:15:44 編集(投稿者)
>
> ■No102869 (くま さん) に返信
> ■No102870 (魔界の仮面弁士 さん) に返信
>
> あちこちから引っ張って来てつくりました。
> 何も分かっていません。
> 身の程知らずですみません。
>
> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
> Dim y() As Double       'データが入る配列
> Dim N As Integer = 5
> Dim M As Integer = 2
> Dim result As Double
> result = SGFilter(y(), N, M)
> End Sub
>
> Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
> Dim i As Integer, j As Integer, k As Integer
> Dim w(0 To N, 0 To M) As Double
> Dim sum As Double
> Dim y2() As Double
>
> ReDim y2(0 To UBound(y))
>
> For i = 0 To UBound(y)
> sum = 0
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = ((j + k) ^ (2 * M))
> Next k
> sum = sum + w(N + j, 0)
> Next j
> For j = -N To N
> For k = 0 To M
> w(N + j, k) = w(N + j, k) / sum
> Next k
> Next j
> For j = -N To N
> sum = 0
> For k = 0 To M
> sum = sum + w(N + j, k) * y(i + j)
> Next k
> y2(i) = y2(i) + sum
> Next j
> Next i
> SGFilter = y2
> End Function

上記ソースの実現したい機能はなんだろうと考え、
勝手な想像ですが、たぶん「Savitzky-Golay法による平滑化」を
行いたいのではないかと思いました。

上記ソースと一致しているかどうかは検証はしていませんが、
下記が計算式に参考にしているサイトではないでしょうか?
https://chaos-kiyono.hatenablog.com/entry/2022/08/19/004312

この推測はあっていますでしょうか?
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102879 ] / ▼[ 102885 ]
■102880 / 5階層)  Re[5]: このエラーを解消したいです。
□投稿者/ kiku (399回)-(2024/01/22(Mon) 15:44:07)
No102879 (kiku さん) に返信
> ■No102875 (みか さん) に返信
>>2024/01/20(Sat) 22:15:44 編集(投稿者)
>>
>>■No102869 (くま さん) に返信
>>■No102870 (魔界の仮面弁士 さん) に返信
>>
>>あちこちから引っ張って来てつくりました。
>>何も分かっていません。
>>身の程知らずですみません。
> 上記ソースの実現したい機能はなんだろうと考え、
> 勝手な想像ですが、たぶん「Savitzky-Golay法による平滑化」を
> 行いたいのではないかと思いました。
>
> 上記ソースと一致しているかどうかは検証はしていませんが、
> 下記が計算式に参考にしているサイトではないでしょうか?
> https://chaos-kiyono.hatenablog.com/entry/2022/08/19/004312
>
> この推測はあっていますでしょうか?
重み係数の計算方法が、ソースと一致していないようなので
違うみたいですね。
どんな計算式を実現したいのかをここに書いて頂ければ
回答が付きそうです。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102880 ] / ▼[ 102887 ]
■102885 / 6階層)  Re[6]: このエラーを解消したいです。
□投稿者/ みか (3回)-(2024/01/23(Tue) 18:34:01)
No102880 (kiku さん) に返信
1年以上前のものです。
あやふやなとこもありますが、はい、たぶんあってる思います。
計算式も分かっていません。
ここがあるのを知って、もしかしてと思いました。
すみません。

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102885 ] / ▼[ 102891 ]
■102887 / 7階層)  Re[7]: このエラーを解消したいです。
□投稿者/ kiku (400回)-(2024/01/24(Wed) 10:20:18)
No102885 (みか さん) に返信
> ■No102880 (kiku さん) に返信
> 1年以上前のものです。
> あやふやなとこもありますが、はい、たぶんあってる思います。
> 計算式も分かっていません。
> ここがあるのを知って、もしかしてと思いました。
> すみません。

計算式がわかっていないとはびっくりです。
仮に表題にあるようにエラーが解消されたとしても
そのエラー解消方法が間違っていた場合
計算結果が違う結果になることも充分に考えられると思うのですが、
大丈夫なのでしょうか?
心配です。
やはり、どんな結果を得たいのかは明確にするべきと思います。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102887 ] / ▼[ 102892 ]
■102891 / 8階層)  Re[8]: このエラーを解消したいです。
□投稿者/ みか (4回)-(2024/01/25(Thu) 23:30:58)
No102887 (kiku さん) に返信

結果に何が出てくるかも分かっていません。
でもとにかく動かしてみたかったのです。
そこでまた考えるという安易なものでした。



[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102891 ] / ▼[ 102900 ]
■102892 / 9階層)  Re[9]: このエラーを解消したいです。
□投稿者/ kiku (402回)-(2024/01/26(Fri) 08:39:53)
No102891 (みか さん) に返信
> ■No102887 (kiku さん) に返信
>
> 結果に何が出てくるかも分かっていません。
> でもとにかく動かしてみたかったのです。
> そこでまた考えるという安易なものでした。

とにかく動かしたいということなら
すでにshuさんから回答がある下記を参照すると良いと思います。
No102876 (shu さん)

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102892 ] / ▼[ 102904 ]
■102900 / 10階層)  Re[10]: このエラーを解消したいです。
□投稿者/ みか (5回)-(2024/01/26(Fri) 21:15:39)
No102892 (kiku さん) に返信
No102876 (shu さん) に返信

はい、とにかく動かしたいとはあります。
でもこのどちらにでもエラーが出てもしまうのです。

> result = SGFilter(y, N, M) ※既出の回答通り多分これ
result = SGFilter(y(), N, M)

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102900 ] / ▼[ 102905 ]
■102904 / 11階層)  Re[11]: このエラーを解消したいです。
□投稿者/ kiku (404回)-(2024/01/29(Mon) 08:47:26)
No102900 (みか さん) に返信
> ■No102892 (kiku さん) に返信
> ■No102876 (shu さん) に返信
>
> はい、とにかく動かしたいとはあります。
> でもこのどちらにでもエラーが出てもしまうのです。
>
>>result = SGFilter(y, N, M) ※既出の回答通り多分これ
> result = SGFilter(y(), N, M)

すみません。
当方、C#ならすぐに回答できるのですが、VB.NETだと回答できません。
他の方の回答を待ってください。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102904 ] / 返信無し
■102905 / 12階層)  Re[12]: このエラーを解消したいです。
□投稿者/ kiku (405回)-(2024/01/29(Mon) 13:18:05)
No102904 (kiku さん) に返信
> ■No102900 (みか さん) に返信
>>■No102892 (kiku さん) に返信
>>■No102876 (shu さん) に返信
>>
>>はい、とにかく動かしたいとはあります。
>>でもこのどちらにでもエラーが出てもしまうのです。
>>
> >>result = SGFilter(y, N, M) ※既出の回答通り多分これ
>>result = SGFilter(y(), N, M)
>
> すみません。
> 当方、C#ならすぐに回答できるのですが、VB.NETだと回答できません。
> 他の方の回答を待ってください。

回答が付かない原因は、新しい情報をご提供頂けていないことが原因だと思います。

ソースを改変して実験してダメであるならば、
下記を提示しましょう。
・経変したソース
  ・全部提示していないように感じます。yに値を設定しているはず。
  ・どこをどのように変更したのか?
・どこでエラーになったのか?
・どんなエラーが出たのか?

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102868 ] / ▼[ 102919 ] ▼[ 102920 ]
■102918 / 1階層)  Re[1]: このエラーを解消したいです。
□投稿者/ みか (6回)-(2024/02/01(Thu) 21:08:59)
皆さん、ありがとうございます。
どこへ書いていいのか分かりませんのでここにさせて頂きます。

Next k の部分で「インデックスが配列の境界外です。」が出るのは、どこかに矛盾があるのですよね?

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y8(0 To 100) As Double
        For i = 0 To 100
            y8(i) = i
        Next

        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result() As Double
        result = SGFilter(y8, N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k                       ' ※ インデックスが配列の境界外です。
                sum = sum + w(N + j, 0)
            Next j
        Next i
        SGFilter = y2
    End Function

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102918 ] / ▼[ 102921 ]
■102919 / 2階層)  Re[2]: このエラーを解消したいです。
□投稿者/ ビール呑み (3回)-(2024/02/02(Fri) 03:42:10)
「Next k」で出ますか?
「w(N + j, k) = ((j + k) ^ (2 * M))」で出るのであればわかるのですが

Dim w(0 To N,[後略]
For j = -N To N
  w(N + j, [後略]

明らかにインデックスが範囲外ですね

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102919 ] / 返信無し
■102921 / 3階層)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (7回)-(2024/02/02(Fri) 20:08:57)
No102919 (ビール呑み さん) に返信
> 「Next k」で出ますか?

> 明らかにインデックスが範囲外ですね
仮にそうとしても、このようなので「Next k」に「インデックスが配列の境界外です。」が出ることはあるのでしょうか?
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102918 ] / ▼[ 102922 ]
■102920 / 2階層)  Re[2]: このエラーを解消したいです。
□投稿者/ kiku (407回)-(2024/02/02(Fri) 10:22:33)
No102918 (みか さん) に返信
> 皆さん、ありがとうございます。
> どこへ書いていいのか分かりませんのでここにさせて頂きます。
>
> Next k の部分で「インデックスが配列の境界外です。」が出るのは、どこかに矛盾があるのですよね?
>
> Dim w(0 To N, 0 To M) As Double

エラーを解消するだけでしたら、
下記に変更すれば良いと思います。
Dim w(0 To 2 * N, 0 To M) As Double

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102920 ] / ▼[ 102923 ] ▼[ 102925 ]
■102922 / 3階層)  Re[3]: このエラーを解消したいです。
□投稿者/ みか (8回)-(2024/02/02(Fri) 20:39:35)
2024/02/02(Fri) 20:41:44 編集(投稿者)
No102920 (kiku さん) に返信

> エラーを解消するだけでしたら、
> 下記に変更すれば良いと思います。
> Dim w(0 To 2 * N, 0 To M) As Double

小出しですみません。
Copilotで聞いても中々解消しないとこもあります。
SGFilter関数でSavitzky-Golayフィルターを適用し、入力配列 y8 を平滑化し結果を返すものでした。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim y8(0 To 100) As Double
        For i = 0 To 100
            y8(i) = i
        Next

        Dim N As Integer = 5
        Dim M As Integer = 2
        Dim result() As Double
        result = SGFilter(y8, N, M)
    End Sub

    Private Function SGFilter(ByVal y() As Double, ByVal N As Integer, ByVal M As Integer) As Double()
        Dim i As Integer, j As Integer, k As Integer
        Dim w(0 To 2 * N, 0 To M) As Double      'Dim w(0 To N, 0 To M) As Double
        Dim sum As Double
        Dim y2() As Double

        ReDim y2(0 To UBound(y))

        For i = 0 To UBound(y)
            sum = 0
            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = ((j + k) ^ (2 * M))
                Next k     ' ※ ここので「インデックスが配列の境界外です。」は解消しました。
                sum = sum + w(N + j, 0)
            Next j

            For j = -N To N
                For k = 0 To M
                    w(N + j, k) = w(N + j, k) / sum
                Next k
            Next j
            For j = -N To N
                sum = 0
                For k = 0 To M
                    sum = sum + w(N + j, k) * y(i + j)     ' ※ 今度はここに「インデックスが配列の境界外です。」
                Next k
                y2(i) = y2(i) + sum
            Next j
        Next i
        SGFilter = y2
    End Function



[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102922 ] / ▼[ 102924 ]
■102923 / 4階層)  Re[4]: このエラーを解消したいです。
□投稿者/ ビール呑み (4回)-(2024/02/02(Fri) 21:29:51)
2024/02/02(Fri) 21:43:22 編集(投稿者)
※用語が間違っていたかもしれないので修正

> sum = sum + w(N + j, k) * y(i + j)     ' ※ 今度はここに「インデックスが配列の境界外です。」

でしょうね
「For i = 0 To UBound(y)」としているのですから、yのインデックスに「i + j」を指定したら範囲外になるはずです

みかさんは、yのインデックスには何を指定したらいいと思いますか?

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102923 ] / 返信無し
■102924 / 5階層)  Re[5]: このエラーを解消したいです。
□投稿者/ みか (9回)-(2024/02/03(Sat) 21:44:59)
No102923 (ビール呑み さん) に返信

> 「For i = 0 To UBound(y)」としているのですから、yのインデックスに「i + j」を指定したら範囲外になるはずです
>
> みかさんは、yのインデックスには何を指定したらいいと思いますか?

まだよくは分かっていませんが、これがSavitzky-Golayフィルターを適用したものになってるか、です。
Copilotで聞いてみても答えが得られませんでした。

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102922 ] / ▼[ 102926 ]
■102925 / 4階層)  Re[4]: このエラーを解消したいです。
□投稿者/ kiku (408回)-(2024/02/05(Mon) 09:17:47)
No102922 (みか さん) に返信
> 2024/02/02(Fri) 20:41:44 編集(投稿者)
>
> ■No102920 (kiku さん) に返信
>
>>エラーを解消するだけでしたら、
>>下記に変更すれば良いと思います。
>>Dim w(0 To 2 * N, 0 To M) As Double
>
> 小出しですみません。
> Copilotで聞いても中々解消しないとこもあります。
> SGFilter関数でSavitzky-Golayフィルターを適用し、入力配列 y8 を平滑化し結果を返すものでした。

> sum = sum + w(N + j, k) * y(i + j) ' ※ 今度はここに「インデックスが配列の境界外です。」
上記のエラーは、y配列の定義を越えてインデックスを指定しているために
エラーになっています。

> For i = 0 To UBound(y)
iの値は範囲は、上記より0〜100

> For j = -N To N
jの値の範囲は、上記より-5〜+5
よって、yのインデックスは、-5〜105となります。

> sum = sum + w(N + j, k) * y(i + j) ' ※ 今度はここに「インデックスが配列の境界外です。」
範囲外の場合にはyの値を0として計算すれば
おそらく良いと思いますので、
上記を下記のように修正すれば良いと思います。
If (0 <= (i + j) And (i + j) <= 100) Then
sum = sum + w(N + j, k) * y(i + j)
End If

※だいぶ前の返答で記述しましたが、計算したい式を明確にしましょう。
 それがないかと、正しいか判断できません。

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102925 ] / ▼[ 102930 ]
■102926 / 5階層)  Re[5]: このエラーを解消したいです。
□投稿者/ kiku (409回)-(2024/02/05(Mon) 10:42:24)
No102925 (kiku さん) に返信
> ■No102922 (みか さん) に返信
>>2024/02/02(Fri) 20:41:44 編集(投稿者)
>>
>>■No102920 (kiku さん) に返信
> If (0 <= (i + j) And (i + j) <= 100) Then
> sum = sum + w(N + j, k) * y(i + j)
> End If

下記の方が良かった。
If (0 <= (i + j) And (i + j) <= UBound(y)) Then
sum = sum + w(N + j, k) * y(i + j)
End If

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102926 ] / ▼[ 102932 ]
■102930 / 6階層)  Re[6]: このエラーを解消したいです。
□投稿者/ みか (10回)-(2024/02/05(Mon) 20:14:07)
No102926 (kiku さん) に返信

> 下記の方が良かった。
> If (0 <= (i + j) And (i + j) <= UBound(y)) Then
> sum = sum + w(N + j, k) * y(i + j)
> End If

エラーが出なくなったら答えも合うかと思ってたのですが安易過ぎたようです。
すみません。

[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102930 ] / ▼[ 102934 ]
■102932 / 7階層)  Re[7]: このエラーを解消したいです。
□投稿者/ kiku (410回)-(2024/02/06(Tue) 08:44:15)
No102930 (みか さん) に返信
> ■No102926 (kiku さん) に返信
>
> エラーが出なくなったら答えも合うかと思ってたのですが安易過ぎたようです。
> すみません。

結果が何かと一致しなかったということですね。
やはり、計算式を提示する必要があると思います。

比較対象は何と比較しているのでしょうか?
これも何かのプログラムでしょうか?

Savitzky-Golayフィルターに関しては
詳しくないので何とも言えませんが
次数によっても係数がかわるようですし、
そもそもパラメータの違うものを比較している
なんてことも考えられます。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102932 ] / ▼[ 102940 ]
■102934 / 8階層)  Re[8]: このエラーを解消したいです。
□投稿者/ kiku (411回)-(2024/02/06(Tue) 10:04:41)
No102932 (kiku さん) に返信
> ■No102930 (みか さん) に返信
>>■No102926 (kiku さん) に返信
>>
>>エラーが出なくなったら答えも合うかと思ってたのですが安易過ぎたようです。
>>すみません。

そもそも目的は何でしょうか?
1.数値として目標とする何かと完全に一致させたい。
2.数値は平均化させたい。
3.その他

上記1であるならば、計算式を明確化する必要があると思います。
これがないと先に進めようがないです。

上記2であるならば、すでに実現できているのではないでしょうか?
また、平均化させたいのであるならば、
Savitzky-Golayフィルターでなくても良いので
別の平均化の方法を使っても良いと思います。

目的を明確にすることをお勧めします。
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102934 ] / ▼[ 102941 ]
■102940 / 9階層)  Re[9]: このエラーを解消したいです。
□投稿者/ みか (11回)-(2024/02/06(Tue) 22:41:44)
2024/02/07(Wed) 00:54:29 編集(投稿者)
No102934 (kiku さん) に返信

> Savitzky-Golayフィルターでなくても良いので
> 別の平均化の方法を使っても良いと思います。
> 
> 目的を明確にすることをお勧めします。

性能の良いのが欲しいので、Savitzky-Golayフィルターに拘ってるとこがあります。
すみません。
一旦解決済みにして出直します。

解決済み
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102940 ] / ▼[ 102943 ]
■102941 / 10階層)  Re[10]: このエラーを解消したいです。
□投稿者/ kiku (412回)-(2024/02/07(Wed) 13:46:00)
No102940 (みか さん) に返信
> 2024/02/07(Wed) 00:54:29 編集(投稿者)
> 性能の良いのが欲しいので、Savitzky-Golayフィルターに拘ってるとこがあります。

ちょっと検索しただけですが
Savitzky-Golay フィルターは
高周波数信号成分を維持するには効果的ですが、
ノイズの除去には優れていないようです。

求める性能がどんなものかわかりませんが、
例えばノイズ除去が目的とするならば
Savitzky-Golay フィルターは
優れていないため、
別のフィルターを選択することを考えることに
なると思われます。

再考にあたっては、このことも
考慮してみてはどうでしょう。

解決済み
[ 親 102868 / □ Tree ] 返信 編集キー/

▲[ 102941 ] / 返信無し
■102943 / 11階層)  Re[11]: このエラーを解消したいです。
□投稿者/ みか (12回)-(2024/02/07(Wed) 19:38:26)
No102941 (kiku さん) に返信

> 再考にあたっては、このことも
> 考慮してみてはどうでしょう。
何が良いかはまだ良く分かっていません。
とりあえずは 平滑化が出来ればと思っています。
解決済み
[ 親 102868 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -