|
setup diary |
void setup() { // put your setup code here, to run once: digitalWrite(A0,LOW); pinMode(A0,OUTPUT); pinMode(A1,INPUT); Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: signed long v=0; while(digitalRead(A1)>0); for(char i=0;i<24;i++){ digitalWrite(A0,HIGH); delayMicroseconds(5); v<<=1; if(digitalRead(A1)>0)v++; digitalWrite(A0,LOW); delayMicroseconds(5); } digitalWrite(A0,HIGH); delayMicroseconds(5); digitalWrite(A0,LOW); delayMicroseconds(5); if(v>=1<<24)v|=0xff000000; Serial.println(v); delay(1000); }
texに貼り付けるためのepsファイルを少し手直ししたくて,inkscapeを使ったのだが,texに貼り付けるとずれてしまうという症状に行き当たった.どうやらboundingboxが問題らしく,これを解決する手段を見つけたので,メモしておく.
inkscapeでepsをsaveすると,その時に表示されている画像が入るギリギリの枠がboundingboxとして作られるが,その原点は枠では無く紙の左下に取られる.texの場合には,枠の左下の座標が原点である方が良いらしく,それが問題になっているようである.
そこで,epsでsaveする直前に,Edit-Resize Page to Selectionとして,紙のサイズを画像ギリギリにして,それからSave asでepsにすると,枠の左下が原点となり,texに貼り付けた時にズレたりしなくなるようである.
以後,inkscapeが必要な時には,この手法を使おうと思う.
mjz<-function(j) diag(j:-j,2*j+1) mjp<-function(j) matrix(diag(sqrt(diffinv(j:-j)*2))[-1,-2*j-2],2*j+1) mjm<-function(j) t(mjp(j)) mjx<-function(j) (mjp(j)+mjm(j))/2 mjy<-function(j) (mjp(j)-mjm(j))/2i me<-function(j) diag(2*j+1)juliaは,比較的新しい言語だが,数値計算には便利かも知れないので,書いてみた.いつかこのルーチンを使ってみたい.
using LinearAlgebra mjz(j)=diagm(j:-1:-j) mjp(j)=diagm(1=>2j:-2:2-2j|>cumsum.|>sqrt) mjm(j)=mjp(j)' mjx(j)=(mjp(j)+mjm(j))/2 mjy(j)=(mjp(j)-mjm(j))/2im me(j)=I(2j+1)pythonはなぜか人気が衰えない言語で,書きにくいけど需要があるかも知れないので,書いてみた.
import numpy as np def mjz(j):return np.diag(j-np.arange(2*j+1)) def mjp(j):return np.diag(np.sqrt(np.cumsum((j-np.arange(2*j))*2)),1) def mjm(j):return mjp(j).T def mjx(j):return (mjp(j)+mjm(j))/2 def mjy(j):return (mjp(j)-mjm(j))/2j def me(j):return np.identity(int(2*j+1))rubyは数値計算にはあまり向かない言語だと思っていたが,numoを使えば数値計算もできそうなので,書いてみた.
require "numo/linalg" def mjz(j) (j-Numo::DFloat[0..2*j]).diag end def mjp(j) Numo::NMath.sqrt((j-Numo::DFloat[0...2*j]).cumsum*2).diag(1) end def mjm(j) mjp(j).transpose end def mjx(j) (mjp(j)+mjm(j))/2 end def mjy(j) (mjp(j)-mjm(j))/2i end def me(j) Numo::DFloat.eye(2*j+1) endRはそのままで実行可能だが,それ以外の3つの言語では,何らかのライブラリを組み込まないといけないのが,少し面倒だ.Rやjuliaは半整数をあまり意識しなくても動くが,pythonとrubyは,rangeが半整数だと動かないので,2*jが整数であることを生かして少し工夫しないといけなかった.R以外の3つの言語では,対角要素の一つ上に成分を並んだ行列を簡単に作れるので,上昇演算子を簡単に書けるが,Rだとそこに工夫が必要で,もう少し良い手法もあるかも知れない.