J言語でCやFortranのプログラムを読み込む



JでCやFortranのプログラムを呼び込む方法のメモ
基本的なやり方は両方とも同じ.でもFortranで呼び込んで計算する時に少し工夫が必要.
まだ幾つか謎な部分があるけど,とりあえずこの方法で殆ど動く.

とりあえず和差積商を求めるプログラムで呼び込んでみる

calc.c
calc.f

###用意するもの
FortranやCのソースファイル
RのR CMD SHLIBコマンドが実行できる環境

Jでドメインエラーが起きてもめげない根性

###実行方法
+++++++++++++++++++++++++++++++++++++
###Cの場合

##Cのソースファイルから共有ライブラリ.soを作る

cd /hogehoge/calc.c   
#ターミナルを起動して対象のフォルダへ移動

R CMD SHLIB calc.c    #共有ライブラリ.soの作成

これでcalc.soというファイルが作成される.

##Jで呼び込んで計算する
#スクリプトのロード

load 'dll'

#.soファイルの場所(フルパス)と関数名,変数を指定する.

u1 =: '/hogehoge/calc.so calc n *d *d *d *d *d *d'   
今回の場合は

.soファイルの名前 calc.so

関数名 void calc{}

変数 double *m, double *n, double *a, double *b, double *c, double *d

なので,*d *d *d *d *d *dのような状態になる.
変数はint型ならiなどに変わる.
nは何を意味しているんだろう.

#値の入力

u2=:(<,1.0),(<,2.0),(<,0.0),(<,0.0),(<,0.0),(<,0.0)
とりあえず1と2の和差積商を求める.
答えになるところの変数の値は0.0を入れておく.
いまいち分からないけど,「,」がネックになっているみたい.

#出力
u1 cd u2
と入力すると
+-+-+-+-+--+-+---+
|0|1|2|3|_1|2|0.5|
+-+-+-+-+--+-+---+
となり答えが出る.


+++++++++++++++++++++++++++++++++++++

###Fortranの場合
##Fortranのソースファイルから共有ライブラリ.soを作る

cd /hogehoge/calc.f   
#ターミナルを起動して対象のフォルダへ移動

R CMD SHLIB calc.f    #共有ライブラリ.soの作成

これでcalc.soというファイルが作成される.

##Jで呼び込んで計算する
#スクリプトのロード

load 'dll'

#.soファイルの場所(フルパス)と関数名,変数を指定する.

u1 =: '/hogehoge/calc.so calc_ n *d *d *d *d *d *d'   
今回の場合は

.soファイルの名前 calc.so

関数名 subroutine calc

変数 real*8 a,b,c,d,e,f
Fortranの場合は.soファイルの場所(フルパス)と関数名,変数を指定する時に,プログラムで設定した関数名の後に_をつけないと読み込んでくれない.

たとえばcalc.fでは関数名にcalcという名前をつけているけど,Jで呼び出すときはcalc_にしないと読み込んでくれないみたい.

#値の入力

u2=:(<,1.0),(<,2.0),(<,0.0),(<,0.0),(<,0.0),(<,0.0)
これに関してはCの場合と同様

#出力
u1 cd u2
と入力すると
+-+-+-+-+--+-+---+
|0|1|2|3|_1|2|0.5|
+-+-+-+-+--+-+---+
となり答えが出る.



J言語でPGMファイルを読み込む

JでPGMファイルを読み込む方法のメモ
ふつうに数値を読み込んで行列化するだけでは表示されないので困っていたら,先生が表示可能にできるプログラムを組んでくださりました.
Macでも表示可能.

##実行方法
#スクリプトのロード
load 'files misc'
load'~addons/media/image3/view_m.ijs'



#ファイル読み込み(実行するとファイル選択ウィンドウが立ち上がる)
im=:fread fselect''

#PGMファイルを表示できるように変換するためのプログラム
    crlfdel=: 3 : 0
u=.(y ~: CR) # y
' ' ((u=LF)#i.$u)}u
)

genpgm=: 3 : 0
u=.(0 1){y
if. ('P2'-:u)=1 do. w=.LF=y
   w=.+/\w
   u=.3}.y
   while.'#'=0{u do. w=.LF=u
     w=.+/\w
     w=.0<w
     u=.}.w#u
   end.
   w=.LF=u
   w=.+/\w
   w=.0=w
   n1n2=.".v=.w#u
   u=.(#v)}.u
   u=.4}.u
   u=.crlfdel u
   u=.".u
   out=.(|.n1n2)$u
else. out=.y
end.
out
)

#読み込んだPGMファイルを変換する
im=:genpgm im

#変換したPGMファイルを表示する
view_image BW256;im


PythonからJ言語の結果を呼ぶ

PythonからJの結果を呼ぶためのコマンド
Macの方で実行すると変な結果が帰ってくるので,とりあえずWindows限定.

##実行方法
#モジュールのインポート
>>> import os

#Jの結果を呼ぶ
>>> return_code = os.system ('/hogehoge/jconsole') #Jのjconsoleがある場所をフルパスで指定

#とりあえず計算させてみる
    exit +/i.6     #0から5までを足してみる.複数行にわたる場合は,最後のコマンドの前にexitを書く.

#結果を表示
>>> return_code
15

JからRも呼べるので,PythonからJを呼んで,そこからまたRを呼ぶというアレげなことを考えてしまったり.
できるのか今度やってみよう.



J言語でテキストファイルを扱う

テキストファイルをJで読み込んで,データとして扱う方法のメモ

##実行方法
#スクリプトのロード
load 'files'         #これがないとfselectが実行できない
load 'misc'        #これがないとchopが実行できない

#ファイル読み込み(実行するとファイル選択ウィンドウが立ち上がる)
rawdata =: 'm' fread fselect''



#データ表示
rawdata
alpha   beta
1       2
3       4
5       6
7       8
9       10

#TABを区切り情報に変える
data=: TAB chop "1 rawdata

#データ表示
data
+-----+--------+
|alpha|beta    |
+-----+--------+
|1    |2       |
+-----+--------+
|3    |4       |
+-----+--------+
|5    |6       |
+-----+--------+
|7    |8       |
+-----+--------+
|9    |10      |
+-----+--------+

#dataからヘッダを切り取る
hdr=: {. data

#dataからデータを切り取り,数値情報として扱う
val=: 0 ".&> }. data

#データ表示
hdr
+-----+----+
|alpha|beta|
+-----+----+

#データ表示
val
1  2
3  4
5  6
7  8
9 10