質問編集履歴
1
簡略化した問題が誤っていたため、削除し、もとのソースコードについての議論を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,57 +10,145 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
|
13
|
+
以下の関数は、2分木探索を再帰的に行い、2**N(Nは任意の実数)の要素数のfloat型配列``a``を``0``,``1``の値に変換するプログラムです。以下の再帰関数の最初の``if``文において、探索木の葉ノードの値を出力するのですが、その値を関数``EST_codeword``に格納します。しかし、``t``のインクリメントがうまくされず、``EST_codeword``に変数が格納されません。
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
|
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
|
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
|
41
|
+
if a>=0:
|
26
42
|
|
27
|
-
t
|
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
|
55
|
+
return tmp
|
30
56
|
|
31
57
|
|
32
58
|
|
33
|
-
|
59
|
+
#interior node operation
|
34
60
|
|
35
|
-
a
|
61
|
+
#step1 left input a output u1_hat #二分木の左側の計算
|
36
62
|
|
37
|
-
a
|
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
|
-
|
67
|
+
u1=SC_decoding(f_half_a)
|
40
68
|
|
41
69
|
|
42
70
|
|
43
|
-
t
|
71
|
+
#step2 right input a,u1_hat output u2_hat #二分木の右側の計算
|
44
72
|
|
45
|
-
a
|
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
|
-
p
|
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
|
-
|
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
|
-
```
|