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

わんくま同盟

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

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


■91939 / )  Re[17]: C++からVBへの変換
□投稿者/ えんえん (15回)-(2019/08/12(Mon) 14:12:33)
ありがとうございます。

以下のようにしてみましたが
やはりうまくいきませんでした。


    Public Sub one_D_FFT(ByRef xr#(), ByRef xi#())


        Dim n As Integer = xr.GetLength(0) - 1

        Dim theta = 2 * Math.PI / n

        Dim xr2 As New ArraySegment(Of Double)(xr), xi2 As New ArraySegment(Of Double)(xi)

        Dim tmpr(n) As Double, tmpi(n) As Double
        Dim tmpr2 As New ArraySegment(Of Double)(tmpr), tmpi2 As New ArraySegment(Of Double)(tmpi)

        Call fft(n, theta, xr2, xi2, tmpr2, tmpi2)


    End Sub




    ' Private Sub fft(ByVal n%, ByVal theta#, ByRef ar As ArraySegment(Of Double), ByRef ai As ArraySegment(Of Double), ByRef tmpr As ArraySegment(Of Double), ByRef tmpi As ArraySegment(Of Double))
    Private Sub fft(ByVal n%, ByVal theta#, ByVal ar As ArraySegment(Of Double), ByVal ai As ArraySegment(Of Double), ByVal tmpr As ArraySegment(Of Double), ByVal tmpi As ArraySegment(Of Double))

        If n <= 1 Then Exit Sub

        Dim radix As Integer = 2
        Do While radix * radix <= n
            If n Mod radix = 0 Then Exit Do
            radix += 1
        Loop

        If n Mod radix <> 0 Then radix = n

        Dim n_radix As Integer = n \ radix

        For j As Integer = 0 To n_radix - 1

            For m As Integer = 0 To radix - 1

                Dim xr As Double = ar.Array(j)
                Dim xi As Double = ai.Array(j)

                For r As Integer = n_radix To n - 1 Step n_radix

                    Dim wr0 As Double = Math.Cos(theta * m * r)
                    Dim wi0 As Double = Math.Sin(theta * m * r)
                    xr += wr0 * ar.Array(r + j) - wi0 * ai.Array(r + j)
                    xi += wr0 * ai.Array(r + j) + wi0 * ar.Array(r + j)

                Next r


                Dim wr As Double = Math.Cos(theta * m * j)
                Dim wi As Double = Math.Sin(theta * m * j)
                tmpr.Array(tmpr.Offset + m * n_radix + j) = xr * wr - xi * wi
                tmpi.Array(tmpi.Offset + m * n_radix + j) = xi * wr + xr * wi

            Next m

        Next j

        For r As Integer = 0 To n - 1 Step n_radix

            fft(n_radix, theta * radix, New ArraySegment(Of Double)(tmpr.Array, tmpr.Offset + r, tmpr.Count - r), New ArraySegment(Of Double)(tmpi.Array, tmpi.Offset + r, tmpi.Count - r), ar, ai)

        Next r



        For j As Integer = 0 To n_radix - 1

            For m As Integer = 0 To radix - 1

                ar.Array(ar.Offset + radix * j + m) = tmpr.Array(n_radix * m + j)
                ai.Array(ai.Offset + radix * j + m) = tmpi.Array(n_radix * m + j)

            Next m

        Next j


    End Sub




> において、「y.Array」や「z.Array」は、配列 x への参照を意味します。

> なので、x(3) = 100 と代入すれば、z(1) も同様に 44 から 100 へと変化します。

「y.Array」や「z.Array」を書き換えた時
元の配列xも同時に変化してくれないといけないのではないのでしょうか?
元の配列xは変化しない方が良いという意味ですか?


> それと、むやみに ByRef を使わないでください。
> 今回は出力引数が存在しないため、ByRef の出番は一切ありません。


fftを再帰的に呼び出しているわけですが、
この場合、配列を書き換えて元のサブルーチンに返しているわけなので、
参照型である必要があるのではないでしょうか?
もっとも配列の場合、ByValを指定したところで、ByRef扱いになると思いますが
間違っていますか?

もし、出力引数がなければ、
再帰処理の意味がなくなってしまうと思うのですが・・・



どうやれば良いか分からないので、
できれば、最終回答をお教えいただけないでしょうか?
恐らく、こうやって何度もやりとりするよりも
効率的だと思うのですが・・・

一度、回答をいただけるとステップ実行しながら
自分の間違いに気づけると思います




返信 編集キー/


管理者用

- Child Tree -