| 2019/08/13(Tue) 00:01:21 編集(投稿者)
追記:拡張メソッドの不具合修正
■No91912 (えんえん さん) に返信 > Dim ar2 As New ArraySegment(Of Double)(ar, r, ar.length - r) > が正しいのでしょうか? > 要素数を最後まで指定しないといけないですよね?
そうなりますね。
処理を分かりやすくするために、ArraySegment のための 拡張メソッドを用意しておくのが良いでしょう。
後述のコードを用意しておけば、 // 元の C++ 実装 tmpr[m * n_radix + j] = xr * wr - xi * wi; に相当する処理を、 tmpr.SetValue(m * n_radix + j, xr * wr - xi * wi) の構文で書ける様になります。
また、再帰呼び出しの // C++ fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai); についても、 fft(n_radix, theta * radix, tmpi.AsSegment(r), tmpi.AsSegment(r), ar, ai) で済むようになります。
'---------------------- Module ArraySegmentExtension <System.Runtime.CompilerServices.Extension> Public Function AsSegment(Of T)(this As T()) As ArraySegment(Of T) Return New ArraySegment(Of T)(this) End Function
<System.Runtime.CompilerServices.Extension> Public Function AsSegment(Of T)(this As T(), start As Integer) As ArraySegment(Of T) Return New ArraySegment(Of T)(this, start, this.Length - start) End Function
<System.Runtime.CompilerServices.Extension> Public Function AsSegment(Of T)(this As ArraySegment(Of T), start As Integer) As ArraySegment(Of T) 'Return New ArraySegment(Of T)(this.Array, this.Offset + start, this.ToArray.Length - this.Offset - start) Return New ArraySegment(Of T)(this.Array, this.Offset + start, this.Array.Length - this.Offset - start) End Function
<System.Runtime.CompilerServices.Extension> Public Function AsSegment(Of T)(this As ArraySegment(Of T), start As Integer, length As Integer) As ArraySegment(Of T) Return New ArraySegment(Of T)(this.Array, this.Offset + start, length) End Function
<System.Runtime.CompilerServices.Extension> Public Function AsSegment(Of T)(this As T(), start As Integer, length As Integer) As ArraySegment(Of T) Return New ArraySegment(Of T)(this, start, length) End Function
<System.Runtime.CompilerServices.Extension> Public Function SetValue(Of T)(this As ArraySegment(Of T), index As Integer, newValue As T) As ArraySegment(Of T) this.Array(this.Offset + index) = newValue Return this 'End Sub End Function End Module |