|
■No91938 (魔界の仮面弁士) に追記 > Dim x() As Byte = New Byte(5) {11, 22, 33, 44, 55, 66} > Dim y As New ArraySegment(Of Byte)(x) > Dim z As New ArraySegment(Of Byte)(x, 2, 3) > において、「y.Array」や「z.Array」は、配列 x への参照を意味します。 > なので、x(3) = 100 と代入すれば、z(1) も同様に 44 から 100 へと変化します。
補足説明。
System.ArraySegment(Of T) は、.NET Framework 2.0 以上で使用可能な、比較的歴史の長い型ですが、 「 z(1) 」のようにインデクサで参照するためには、.NET Framework 4.5 以上が必要となります。
.NET Framework 4 以下の場合、LINQ 操作にさえ対応していないのでご注意ください。
■No91942 (魔界の仮面弁士) に追記 >> できれば、最終回答をお教えいただけないでしょうか? > 申し訳ありませんが、現状は言語文法的な側面からしか回答できません。
ということで、文法的に変換しただけで、コンパイルすらしていないコードですが、 一応、当方で翻訳してみたものを掲載してみます。
C/C++ はそもそも専門外ですし、FFT の理論も全く理解しておらず、おまけに どんな値を渡せばよいのか、そしてどういう結果になるべきかというテスト要件すら不明なので、 およそ「最終回答」と呼ぶには程遠いコードではありますが、一応参考までに。
'void fft(int n, double theta, double ar[], double ai[], double tmpr[], double tmpi[]) '{ 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) return; If n <= 1 Then Exit Sub
'/* ---- factorization ---- */ 'for (radix = 2; radix * radix <= n; radix++) { ' if (n % radix == 0) break; '} Dim radix As Integer = 2 Do While radix * radix <= n If n Mod radix = 0 Then Exit Do radix += 1 Loop
'if (n % radix != 0) radix = n; 'n_radix = n / radix; If n Mod radix <> 0 Then radix = n Dim n_radix As Integer = n \ radix
'/* ---- butterflies ---- */ 'for (j = 0; j < n_radix; j++) { ' for (m = 0; m < radix; m++) { For j As Integer = 0 To n_radix - 1 For m As Integer = 0 To radix - 1
'xr = ar[j]; 'xi = ai[j]; '==> ここから修正案の新コード Dim xr As Double = ar(j) Dim xi As Double = ai(j) '=== ここから No91939 の旧コード 'Dim xr As Double = ar.Array(j) 'Dim xi As Double = ai.Array(j) '<==
'for (r = n_radix; r < n; r += n_radix) { For r As Integer = n_radix To n - 1 Step n_radix
'wr = cos(theta * m * r); 'wi = sin(theta * m * r); Dim wr0 As Double = Math.Cos(theta * m * r) Dim wi0 As Double = Math.Sin(theta * m * r)
'xr += wr * ar[r + j] - wi * ai[r + j]; 'xi += wr * ai[r + j] + wi * ar[r + j]; '==> ここから修正案の新コード xr += wr0 * ar(r + j) - wi0 * ai(r + j) xi += wr0 * ai(r + j) + wi0 * ar(r + j) '=== ここから No91939 の旧コード xr += wr0 * ar.Array(r + j) - wi0 * ai.Array(r + j) xi += wr0 * ai.Array(r + j) + wi0 * ar.Array(r + j) '<==
'} Next r
'wr = cos(theta * m * j); 'wi = sin(theta * m * j); Dim wr As Double = Math.Cos(theta * m * j) Dim wi As Double = Math.Sin(theta * m * j)
'tmpr[m * n_radix + j] = xr * wr - xi * wi; 'tmpi[m * n_radix + j] = xi * wr + xr * wi; 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 = 0; r < n; r += n_radix) { ' fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai); '} For r As Integer = 0 To n - 1 Step n_radix '==> ここから修正案の新コード (要 No91917 の拡張メソッド) fft(n_radix, theta * radix, tmpr.AsSegment(r), tmpi.AsSegment(r), ar, ai) '=== ここから No91939 の旧コード 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 = 0; j < n_radix; j++) { ' for (m = 0; m < radix; m++) { ' ar[radix * j + m] = tmpr[n_radix * m + j]; ' ai[radix * j + m] = tmpi[n_radix * m + j]; ' } '} For j As Integer = 0 To n_radix - 1 For m As Integer = 0 To radix - 1 '==> ここから修正案の新コード (要 No91917 の拡張メソッド) ar.SetValue( radix * j + m, tmpr(n_radix * m + j) ) ai.SetValue( radix * j + m, tmpi(n_radix * m + j) ) '=== ここから No91939 の旧コード 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
|