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

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

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

Re[2]: どのように書けば簡単なのでしょうか?


(過去ログ 176 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■101054 / inTopicNo.1)  どのように書けば簡単なのでしょうか?
  
□投稿者/ ゆい (1回)-(2022/12/22(Thu) 15:17:58)

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

初歩的なことですみません。
下のはN = 5としての、dat(ii)に対してのdatX(i)を求める計算です。
これと同じことをN = 15、N = 65としても行いたいのですが、どのように書けば簡単なのでしょうか?
同じことを3っつ書けば良いのですが、データ数が多いと時には、とてつもなく時間が掛かってしまいます。

    'N = 5としての場合
        Dim N As Integer = 5 : Dim A As Integer = 6 : Dim B As Single = 0.85 
        Dim σ As Single = N / A : Dim offset As Single = Int(B * (N - 1))
        For i = 0 To 100000
            If i >= N - 1 Then
                Dim ΣXi As Single = 0
                Dim ip As Integer = 0
                Dim X1(1500000) As Single 
                For ii = i - (N - 1) To i
                    ip = ip + 1
                    X1(ii) = Math.Exp(-((ip - offset) ^ 2) / (σ ^ 2)) 
                    ΣXi = ΣXi + X1(ii)
                Next
                '
                Dim ΣCiXi As Single = 0
                For ii = i - (N - 1) To i
                    ΣCiXi = ΣCiXi + dat(ii) * X1(ii)
                Next
                datX(i) = (ΣCiXi) / (ΣXi)
            End If
        Next

引用返信 編集キー/
■101056 / inTopicNo.2)  Re[1]: どのように書けば簡単なのでしょうか?
□投稿者/ 魔界の仮面弁士 (3513回)-(2022/12/22(Thu) 15:41:08)
No101054 (ゆい さん) に返信
> 下のはN = 5としての、dat(ii)に対してのdatX(i)を求める計算です。
dat(ii) というのは、配列変数でしょうか。それとも Function でしょうか。

ひとまず、dat と datX いずれも
「dat(100000) As Single」な配列と仮定してみます。


> For i = 0 To 100000
>  If i >= N - 1 Then
ここは
 For i = Math.Max(0, N - 1) To 100000
にすることで、If 文が不要になりそうな予感。


> これと同じことをN = 15、N = 65としても行いたいのですが、どのように書けば簡単なのでしょうか?
変数 N をメソッド引数にすればよいかと。

たとえば下記のようにしておけば、
 Example(5)
 Example(15)
 Example(65)
のようにして呼び出せます。


Private Sub Example(N As Integer)
  Dim A As Integer = 6 : Dim B As Single = 0.85F
  Dim σ As Single = N / CSng(A) : Dim offset As Single = Int(B * (N - 1))
  For i = 0 To 100000
    If i >= N - 1 Then
      Dim ΣXi As Single = 0F
      Dim ip As Integer = 0
      Dim X1(1500000) As Single
      For ii = i - (N - 1) To i
        ip += 1
        X1(ii) = CSng(Math.Exp(-((ip - offset) ^ 2) / (σ ^ 2)))
        ΣXi += X1(ii)
      Next
      '
      Dim ΣCiXi As Single = 0F
      For ii = i - (N - 1) To i
        ΣCiXi += dat(ii) * X1(ii)
      Next
      datX(i) = (ΣCiXi) / (ΣXi)
    End If
  Next
End Sub
引用返信 編集キー/
■101058 / inTopicNo.3)  Re[2]: どのように書けば簡単なのでしょうか?
□投稿者/ ゆい (2回)-(2022/12/22(Thu) 20:07:39)
No101056 (魔界の仮面弁士 さん) に返信

ありがとうございます。

簡単になりました。
dat(ii)は配列変数です。

それとこの処理の高速化は出来ませんよね?
難しいのは無理ですが・・。
今は仮にデータ数は100,000件(For i = 0 To 100000)とはしてるのですが、
これがもっと増えて1,200,000件ともなりますと、実に1時間余りも掛かってしまいます(^^;


引用返信 編集キー/
■101059 / inTopicNo.4)  Re[3]: どのように書けば簡単なのでしょうか?
□投稿者/ KOZ (376回)-(2022/12/22(Thu) 20:32:58)
2022/12/22(Thu) 20:39:34 編集(投稿者)

No101058 (ゆい さん) に返信
> それとこの処理の高速化は出来ませんよね?
> 難しいのは無理ですが・・。


Dim X1(1500000) As Single
  ↓
Dim X1 As New Dictionary(Of Integer, Single)

でどうですか?

ループの外に持って行っても良さそうです。
引用返信 編集キー/
■101060 / inTopicNo.5)  Re[3]: どのように書けば簡単なのでしょうか?
□投稿者/ 魔界の仮面弁士 (3514回)-(2022/12/22(Thu) 20:37:09)
No101058 (ゆい さん) に返信
> それとこの処理の高速化は出来ませんよね?

最終的に必要なのは、どの値ですか?

この計算が何を意味するのか分からないのですが、なんとなく、
2 つある「For ii = i - (N - 1) To i」は 1 つにまとめられそうですし、
局所変数である X1 は配列にする必要もないように思えました。
ロジック次第では Parallel.For での並列処理ができるかもしれません。

(どうなれば正しいのか分からないので、書き換えのお手伝いはできませんが…)
引用返信 編集キー/
■101062 / inTopicNo.6)  Re[4]: どのように書けば簡単なのでしょうか?
□投稿者/ ゆい (4回)-(2022/12/22(Thu) 22:16:35)
No101059 (KOZ さん) に返信

> Dim X1(1500000) As Single
>   ↓
> Dim X1 As New Dictionary(Of Integer, Single)

これはどのような意味ですか?
凄く早くなりました。

引用返信 編集キー/
■101063 / inTopicNo.7)  Re[4]: どのように書けば簡単なのでしょうか?
□投稿者/ ゆい (5回)-(2022/12/22(Thu) 22:23:27)
2022/12/22(Thu) 22:34:29 編集(投稿者)

No101060 (魔界の仮面弁士 さん) に返信

最終的に必要なのはdatX(i)です。

まだ数値が合ってるかのは調べてはいませんが、
> KOZ (22/12/22(Thu) 20:32) #101059
のお教えで上手く行くような気がします。



引用返信 編集キー/
■101064 / inTopicNo.8)  Re[5]: どのように書けば簡単なのでしょうか?
□投稿者/ KOZ (378回)-(2022/12/22(Thu) 22:49:58)
No101062 (ゆい さん) に返信
> ■No101059 (KOZ さん) に返信
>
>>Dim X1(1500000) As Single
>>  ↓
>>Dim X1 As New Dictionary(Of Integer, Single)
>
> これはどのような意味ですか?

https://atmarkit.itmedia.co.jp/ait/articles/0603/31/news116.html

> 凄く早くなりました。

大量の配列を確保する処理は遅いので、For i = 0 To 100000 の外に
Dim X1(1500000) As Single を持っていくと、もう少し速くなります。

引用返信 編集キー/
■101066 / inTopicNo.9)  Re[1]: どのように書けば簡単なのでしょうか?
□投稿者/ shu (1285回)-(2022/12/23(Fri) 10:05:52)
No101054 (ゆい さん) に返信

x1の配列を作る必要がないです。
以下の処理でどうでしょうか?

        Dim N As Integer = 5 : Dim A As Integer = 6 : Dim B As Single = 0.85
        Dim σ As Single = N / A : Dim offset As Single = Int(B * (N - 1))
        If N < 100000 Then
            For i = N - 1 To 100000
                Dim ΣXi As Single = 0
                Dim ip As Integer = 0
                Dim ΣCiXi As Single = 0

                For ii = i - (N - 1) To i
                    ip = ip + 1
                    Dim x1 = Math.Exp(-((ip - offset) ^ 2) / (σ ^ 2))
                    ΣXi += x1
                    ΣCiXi += dat(ii) * x1
                Next
                datX(i) = (ΣCiXi) / (ΣXi)
            Next
        End If

引用返信 編集キー/
■101068 / inTopicNo.10)  Re[6]: どのように書けば簡単なのでしょうか?
□投稿者/ ゆい (6回)-(2022/12/23(Fri) 23:24:54)
No101064 (KOZ さん) に返信

紹介の説明は見たのですが、初心者のためよく分かりませんでした。
でも凄く早いですし計算も合ってるようなので使わせていただきます。
配列を外に置くのは様子を見てにします。
ありがとうございました。

解決済み
引用返信 編集キー/
■101069 / inTopicNo.11)  Re[2]: どのように書けば簡単なのでしょうか?
□投稿者/ ゆい (7回)-(2022/12/23(Fri) 23:31:51)
No101066 (shu さん) に返信

使い方が悪いのかもしれませんが少し計算が違うようでした。
ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -