質問編集履歴

1

簡略化した問題が誤っていたため、削除し、もとのソースコードについての議論を追加

2021/05/01 09:04

投稿

kaneko_
kaneko_

スコア9

test CHANGED
File without changes
test CHANGED
@@ -10,57 +10,145 @@
10
10
 
11
11
 
12
12
 
13
- 例として深さ1、分木3の再帰関数にいて考えます。
13
+ 以下の関数は2分木探索を再帰的に行い、2**N(Nは任意実数)の要素数のfloat型配列``a``を``0``,``1``の値に変換するプログラムです。以下の再帰関数の最初の``if``文いて、探索木の葉ノードの値を出力するのですが、その値を関数``EST_codeword``に格納します。しかし、``t``のインクリメントがうまくされず、``EST_codeword``に変数が格納されません。
14
14
 
15
15
 
16
16
 
17
- ```python
17
+ ###該当のソースコード
18
18
 
19
+ ```numpy
20
+
21
+ #2**N(Nは任意の実数)の要素数の配列``a``を入力し、値を2分木探索して計算する関数
22
+
23
+
24
+
25
+ #node operation
26
+
27
+
28
+
29
+ EST_codeword=np.zeros(len(a))
30
+
31
+ t=0
32
+
19
- def add():
33
+ def SC_decoding(a):
20
34
 
21
35
  global t
22
36
 
37
+ #leaf node operation
23
38
 
39
+ if a.shape[0]==1:
24
40
 
25
- if t<10:
41
+ if a>=0:
26
42
 
27
- t+=1
43
+ tmp=np.zeros(1)
28
44
 
45
+ elif a<0:
46
+
47
+ tmp=np.ones(1)
48
+
49
+ EST_codeword[t]=tmp #葉ノードが返す値を格納する関数
50
+
51
+ print(t) #ここでtが正しくインクリメントされているかどうかを確認する
52
+
53
+ t=+1
54
+
29
- return 0
55
+ return tmp
30
56
 
31
57
 
32
58
 
33
- add() #ここでt==1
59
+ #interior node operation
34
60
 
35
- add() #ここでt==2
61
+ #step1 left input a output u1_hat #二分木の左側の計算
36
62
 
37
- add() #ここでt==3
63
+ tmp1=np.split(a,2)
38
64
 
65
+ f_half_a=np.sign(tmp1[0])*np.sign(tmp1[1])*np.amin(np.abs(a))
66
+
39
- return 0
67
+ u1=SC_decoding(f_half_a)
40
68
 
41
69
 
42
70
 
43
- t=0
71
+ #step2 right input a,u1_hat output u2_hat #二分木の右側の計算
44
72
 
45
- add()
73
+ tmp2=np.split(a,2)
46
74
 
75
+ g_half_a=tmp2[1]+(1-2*u1)*tmp2[0]
76
+
77
+ u2=SC_decoding(g_half_a)
78
+
79
+
80
+
81
+ #step3 up input u1,u2 output a_hat #入力されたaを計算した値a_hatを求める
82
+
83
+ res=np.concatenate([(u1+u2)%2,u2])
84
+
85
+ return res
86
+
87
+
88
+
89
+ ```
90
+
91
+ ### 発生している問題・エラーメッセージ
92
+
93
+ 試しに、
94
+
95
+ ```
96
+
97
+ a=[-0.80082963 1.3845885 -0.90126979 0.69719649 -1.31832405 -0.1590969
98
+
99
+ 1.55812294 -0.494428 -0.39330792 -0.65102752 0.86097633 1.00317875
100
+
101
+ 1.04088517 0.64219232 0.61946126 -1.10920215]
102
+
103
+ ```
104
+
105
+ について、上記の関数を適応させた結果を、出力すると、
106
+
47
- print(t)
107
+ ```python
108
+
109
+ 0 
110
+
111
+ 1
112
+
113
+ 1 #(t=)2となる予想だった
114
+
115
+ 1 #3
116
+
117
+ 1 #4
118
+
119
+ 1 #5,....
120
+
121
+ 1
122
+
123
+ 1
124
+
125
+ 1
126
+
127
+ 1
128
+
129
+ 1
130
+
131
+ 1
132
+
133
+ 1
134
+
135
+ 1
136
+
137
+ 1
138
+
139
+ 1 #ここまで、tの値
140
+
141
+ [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] #関数の出力した``EST_codeword``の値
48
142
 
49
143
  ```
50
144
 
51
145
 
52
146
 
147
+ となってしまい、``t``の値が1以上になっていないことがわかります。(本当はプリントされるたびにインクリメントされていてほしい)
148
+
53
- 以上のよう想定をしていたのですが結果
149
+ お、関数出力ある``a_hat``の値に誤りありませんでした。
54
150
 
55
151
 
56
-
57
- ```
58
-
59
- 1
60
-
61
- ```
62
-
63
- になってしまいます。
64
152
 
65
153
  ### 補足情報(FW/ツールのバージョンなど)
66
154
 
@@ -70,84 +158,6 @@
70
158
 
71
159
 
72
160
 
73
- ### 元のソースコード
161
+ ### 参考にしたwebサイト
74
162
 
75
-
76
-
77
- 一応、簡略化する前の元のソースコードも載せておきます
78
-
79
-
80
-
81
- ```numpy
82
-
83
- #SC復号
84
-
85
-
86
-
87
- #2**N(Nは任意の実数)の要素数の配列``a``を入力し、値を2分木探索して計算する関数
88
-
89
-
90
-
91
- #node operation
92
-
93
- def SC_decoding(a):
94
-
95
- global t
96
-
97
- #interior node operation
98
-
99
- if a.shape[0]==1:
100
-
101
- #flozen_bit or not
102
-
103
- if np.any(flozen_bit==t):
104
-
105
- tmp=np.zeros(1)
106
-
107
- if a>=0:
108
-
109
- tmp=np.zeros(1)
110
-
111
- elif a<0:
112
-
113
- tmp=np.ones(1)
114
-
115
- EST_codeword[t]=tmp
116
-
117
- print(t)
118
-
119
- t=+1
120
-
121
- return tmp
122
-
123
-
124
-
125
- #step1 left input a output u1_hat
126
-
127
- tmp1=np.split(a,2)
128
-
129
- f_half_a=np.sign(tmp1[0])*np.sign(tmp1[1])*np.amin(np.abs(a))
163
+ https://www.youtube.com/watch?v=O3JWkvEY8Lc (英語ですが、スライドを用いてアルゴリズムの説明をしています。)
130
-
131
- u1=SC_decoding(f_half_a)
132
-
133
-
134
-
135
- #step2 right input a,u1_hat output u2_hat
136
-
137
- tmp2=np.split(a,2)
138
-
139
- g_half_a=tmp2[1]+(1-2*u1)*tmp2[0]
140
-
141
- u2=SC_decoding(g_half_a)
142
-
143
-
144
-
145
- #step3 up input u1,u2 output a_hat
146
-
147
- res=np.concatenate([(u1+u2)%2,u2])
148
-
149
- return res
150
-
151
-
152
-
153
- ```