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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91939 の関連記事表示

<< 0 >>
■91939  Re[17]: C++からVBへの変換
□投稿者/ えんえん -(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扱いになると思いますが
    間違っていますか?
    
    もし、出力引数がなければ、
    再帰処理の意味がなくなってしまうと思うのですが・・・
    
    
    
    どうやれば良いか分からないので、
    できれば、最終回答をお教えいただけないでしょうか?
    恐らく、こうやって何度もやりとりするよりも
    効率的だと思うのですが・・・
    
    一度、回答をいただけるとステップ実行しながら
    自分の間違いに気づけると思います
    
    
    
    
記事No.91899 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -