2009年9月29日火曜日

maxscript 計測時間

久々maxscriptネタ。

maxscriptも調べたらhelpに載ってました。

start = timeStamp()
--------------------------
ここに計りたいscriptを書く。
--------------------------
end = timeStamp()

format "Processing took % seconds\n" ((end - start) / 1000.0)

これで実行時間が計れます。

python 計測時間

250000ループを含む関数をmaxscriptとpython実行、iphoneのストップウォッチで計測してみた。
結果
maxscript 24.2sec
python 12.3sec

pythonで実行時間の計測をしてくれる関数があった。
http://jutememo.blogspot.com/2008/10/python_07.html

import timeit
t = timeit.Timer("import def_GetCloseColor")
print t.timeit()

デフォルトだと100万回の結果が計算される。
t.timeit(10)とかやると10回の結果。
print t.repeat(3)だと100万回を3回計算する。

2009年9月25日金曜日

python numpy

ベクトル
ベクトルの長さ&正規化

import numpy
a = numpy.array([[2,2]])

#ベクトルの長さ
length = numpy.linalg.norm(a)
#length=>2.8284271247461903

#ベクトルの正規化
a / numpy.linalg.norm(a)
#=>array([[ 0.70710678, 0.70710678]])

内積&外積

import numpy
v1 = numpy.array((1,0,0))
v2 = numpy.array((0,1,0))

#内積
numpy.dot(v1,v2) #=> 0
#外積
numpy.cross(v1,v2) #=>[0 0 1]

一般的には2次元の外積の存在は賛否が分かれる所ですが、numpyでは2次元ベクトルの外積が用意されています。

import numpy

numpy.cross([0,1],[ 1,0]) #-1
numpy.cross([0,1],[-1,0]) # 1
numpy.cross([1,0],[ 0,1]) # 0

内積を90度回転させた感じですね、左右の正と負の領域判定に使えそうです。
行列
単位行列の定義

import numpy
I = numpy.matrix(numpy.identity(3))
#[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]

転置

import numpy
a = numpy.matrix([[1,2],[3,4]])
# [[1, 2],
# [3, 4]]

a.T
# [[1, 3],
# [2, 4]]

逆行列&行列式

import numpy
a = numpy.matrix([[3,1], [1,2]])

#逆行列
a.I
#[[ 0.4, -0.2],
# [-0.2, 0.6]]

#行列式
numpy.linalg.det(a)
# 5.0


回転行列

import python
from numpy import sin,cos
r = numpy.pi/2.

#2次元回転
numpy.matrix( (
( cos(r), sin(r)),
(-sin(r), cos(r))
) )

#3次元z軸回転
numpy.matrix( (
( cos(r), sin(r), 0.),
(-sin(r), cos(r), 0.),
( 0., 0., 1.)
) )

#3次元x軸回転
numpy.matrix( (
( 1., 0., 0.),
( 0., cos(r), sin(r)),
( 0.,-sin(r), cos(r))
) )

#3次元y軸回転
numpy.matrix( (
( cos(r), 0.,-sin(r)),
( 0., 1., 0.),
(-sin(r), 0., cos(r))
) )


行列とベクトルの積

import numpy
#行列
mat = numpy.matrix( (
(2.0, 0.0, 10),
(0.0, 3.0, 10),
) )
#ベクトル
vec = numpy.array( (2.0,2.0, 1.0) )

#行列とベクトルの積
numpy.dot(mat,vec)
#[ 14. 13.]

固有値・固有ベクトル&対角化

固有値、固有ベクトルは以下の式が成り立つベクトルとスカラ。

A*v = λ*v(λ=Aの固有値,v=Aの固有ベクトルとする)

行列の対角化(diagonal)とは、正方行列Aに対して対角化された行列をPとすると、

P^-1 * A * P = 対角要素が固有値の行列

(P^-1はPの逆行列を表す)

となる行列である。

なお、numpy.diagonal()は対角化する関数ではなく、単に行列の対角要素をベクトルとして返す関数なので注意。

import numpy
A = numpy.array([[5,-2],[-4,7]])
(l,v) = numpy.linalg.eig( A )
#l=>[ 3., 9.]
#v=>[[-0.70710678, 0.4472136 ],
# [-0.70710678, -0.89442719]]

その他
平均値&標準偏差

import numpy
pop = [79,81,77,78,83,80,82,78,80,82]

#平均
numpy.mean(pop) #=>80.0
#標準偏差
numpy.std(pop) #=>1.8973665961010275

相関係数&相関係数行列

import numpy
a = [1,2,3,4,5]
b = [1,1,3,5,5]
c = [5,4,3,1,1]
d = [-1,3,-4,5,-5]

#aとbの相関係数
numpy.corrcoef(a,b)[0][1] #=> 0.948683298051
#aとcの相関係数
numpy.corrcoef(a,c)[0][1] #=> -0.972271824132
#aとdの相関係数
numpy.corrcoef(a,d)[0][1] #=> -0.218797487247

#a,b,c,dの相関係数行列
numpy.corrcoef([a,b,c,d])
#[[ 1. 0.9486833 -0.97227182 -0.21879749]
# [ 0.9486833 1. -0.97827974 -0.1153164 ]
# [-0.97227182 -0.97827974 1. 0.01933915]
# [-0.21879749 -0.1153164 0.01933915 1. ]]

高速フーリエ変換(FFT)

import numpy
t = numpy.arange(0.0, 2*numpy.pi, 2*numpy.pi/32)
c = numpy.cos(t)
C = numpy.fft.fft(c)

2009年9月17日木曜日

Houdini hscript

padzero(4,$F4+299)

$PR プリミティブナンバー毎 $PTのプリミティブ版

AttributePromote 
ポイントの持つアトリビュートを、プリミティブアトリビュートに変換。
逆や他への変換も可能。

2009年9月9日水曜日

2009年9月7日月曜日

python memo on Houdini

hou.node("/").allSubChildren()

http://www.sidefx.com/docs/houdini10.0/hom/cookbook/object_xform/

Siggraph2009 at New Orleans

すっかり遅くなりましたが、シーグラフの写真をちょいちょいまとめようかと思います。
とりあえず、iphoneで撮った写真から。
NewOrleansは初めてでしたが、今まで一番楽しい町でした。
そういえば、サンディエゴもかなり良かったけど、夜楽しめたのは初めてでした。


Burbon street




Full conferenceで無くとも、Exhibitionで結構良い内容のPresentation見れます。
これはDigitalDomain。

これはRythm and Hues