LoginSignup
3
0

More than 5 years have passed since last update.

数値計算 > 偶数から奇数へ > Ceilを使わない方法でPython実装してみる (正の偶数にのみ対応) | 元の実装の意図: 引数が偶数でも奇数でも対応

Last updated at Posted at 2018-02-04
動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6

擬似コード

Num = CEIL((Num - 1) / 2)
XS = [0] * (2 * Num + 1)

偶数のNumを元に奇数のサイズのXSを定義したいようだ。
CEIL()を使う理由が分からなかった。

コードの下の方で以下があった。

for i = -Num to Num   # Numまでを含めたループ
    ...

このループのために冒頭のNumをCEIL()で取得しているようだ。

別案

Ceilを使わない方法をPythonで書いてみる。

Nloopの計算は二通り考えた。Pythonであれば後者が簡潔に記載できる。
(後者: floor division)

ceil()がある言語ではceil()を使う方がいいかもしれない。ただし、最初にceil()を使うのではなく、ループ変数計算用にceil()を使う方が読みすいと思う。

test_odd2even_loop_180204.py

# tested on Python 3.5.2

Neven = 8

Nodd = Neven - 1
# 1. for non-Pythonic language
Nloop = (int)((Nodd - 1) / 2) + 1
# 2. for Python
Nloop = Nodd // 2 + 1

for idx in range(-Nloop, Nloop+1):  # +1: range() does not include end point
    print(idx)

run
$ python3 test_odd2even_loop_180204.py 
-4
-3
-2
-1
0
1
2
3
4

こういうループはSpherical Harmonicsのorder, degreeの計算でよく目にする。

code修正

最初にCEIL()で処理しているので、下記が正解だろうか。

test_odd2even_loop_180204.py

# tested on Python 3.5.2

Neven = 8

Nodd = Neven + 1
# 1. for non-Pythonic language
Nloop = (int)((Nodd - 1) / 2)
# 2. for Python
Nloop = Nodd // 2

for idx in range(-Nloop, Nloop+1):  # +1: range() does not include end point
    print(idx)

元の擬似コード実装では、最初にCEIL()を使うことで引数が奇数でも偶数でも対応する、という意図がある気がしてきた。

3
0
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0