เขียน Mathematica package แบบง่ายๆ

มาลองเขียน Mathematica package แบบง่ายๆกันครับ

Mathematica package คืออะไร Mathematica package ก็คือชุดคำสั่งหรือโปรแกรมที่ถูกเขียนขึ้นเพื่อใช้ในการคำนวณเฉพาะด้าน ซึ่งจะมีสกุล .m

โดยถ้าเปิดไฟล์ .m ด้วย text editor อย่างเช่น notepad หรือ Mathematica เองเราจะเห็น code ข้างในมีคำสั่งหลักๆดังนี้ เช่น

BeginPackage[ “ชื่อpackage`”]
คำสั่ง1::usage = “คำสั่ง1[ x] คำอธิบายการใช้คำสั่ง1”
Begin[ “Private`”]
คำสั่ง1[ x_] :=  ….
End[]
EndPackage[]

การเรียกใช้งาน package ใน Mathematica เพียงใช้คำสั่ง Get หรือเครื่องหมาย << เช่น ถ้าpackage เราชื่อ MyPackage ก็เพียงพิมพ์
Get[MyPackage`]
หรือ
<<MyPackage`

ตัวอย่าง Package ชื่อ MyPackage ซึ่งมีคำสั่งอยู่ สองคำสั่งคือ fun1[x ] สำหรับหาค่า x^3 กับ fun2[x,y] สำหรับหาค่า sin(x)*cos(y)

BeginPackage[ “MyPackage`”]

fun1::usage = “fun1[ x] calculates x^3 ”
fun2::usage = “fun2[ x,y] calculates sin(x)*cos(y)”

Begin[ “Private`”]

fun1[ x_] := x^3

fun2[x_,y_]:=Sin[x ] * Cos[y]

End[]
EndPackage[]

ในการทดลองเขียน package ก็เพียงเปิด Mathematica แล้วพิมพ์ Code ของ package
ลงไปใน notebook แล้ว save เป็นแบบ Mathematica package ดูขั้นตอนตามรูปครับ

ในการเรียกใช้งาน package ก่อนอื่นเราต้องทำการบอก Mathematica ก่อนว่า package (MyPackage.m) ของเราอยู่ที่ไหน
ในตัวอย่างนี้สมมุติว่า MyPackage.m อยู่ที่ C:/TEMP ซึ่งเราสามารถบอก Mathematica
โดยใช้คำสั่ง AppendTo เพื่อเพิ่ม “C:/TEMP” เข้าไปในตัวแปร $Path
ซึ่งเป็นตัวแปรที่เก็บ Path หลักๆที่ Mathematica จะใช้ในการค้นหา Package ต่างๆ
หรือจะใช้ Needs[“MyPackage`”,”C:/TEMP/MyPacjage.m”] ในการเรียกใช้งานก็ได้ครับ

เกี่ยวกับ AppendTo Sow Reap

ดูเหมือนว่าการใช้ AppendTo ในการเก็บค่าของตัวแปรที่สนใจจะทำให้การคำนวณช้าลงเมื่อ list ของตัวแปรมีขนาดใหญ่ขึ้นเรื่อย ๆ

แนะนำว่าควรจะใช้ Sow และ Reap ช่วยจะดีกว่า ซึ่งก็ช่วยได้ เร็วขึ้นมาจริง (รู้สึกได้)

ถ้าต้องการจะใช้ Sow แบบ Parallel ก็ทำแบบนี้ได้ครับ

SetSharedFunction[ParallelSow]
ParallelSow[expr_]:=Sow[expr]

อ่าน input file โดยใช้ Mathematica

จากตัวอย่างเกี่ยวกับการหาคำแรกหรือชื่อตัวแปรจาก input file http://www.sakngoi.com/?p=69 เราสามารถเขียนโดยใช้ Mathematica ได้เช่น

ExtractVal[txtin_List, keyword_String] := Module[{pos, val},
(* extract the value of the keyword from the input file *)
(* txtin = Import[inputfile,”Table”]; *)
pos = Select[Position[ToLowerCase /@ txtin, keyword], #[[2]] == 1 &];
If[Length@pos == 1, val = txtin[[pos[[1, 1]], 2]];];
val
];

โดยที่ keyword ใน function ExtractVal นั้นก็เป็นชื่อตัวแปรที่เราต้องการนำไปใช้

ตัวอย่าง function ReadPar นี้จะให้ค่าที่อ่านได้จาก input file โดยในที่นี้สมมุติให้ ชื่อตัวแปรที่ต้องการค่าสำหรับ function DistributeN มีดังนี้คือ “initn”, “lifecycle”, “mu”, และ “sigma”

ReadPar[inputfile_String] := Module[{txtin, outls, distributenparms},
txtin = Import[inputfile, “Table”];
outls = {};

(* for DistributeN *)
distributenparms = {“initn”, “lifecycle”, “mu”, “sigma”};
outls = ToExpression/@(ExtractVal[txtin, #] & /@ distributenparms);

If[Length@outls!=Length@distributenparms,
Print[“Please check your input file. Some values are missing.”];
];

outls
];

ตัวอย่างของ input file (input.in)

initN    2.30*10^11
Mu       10
LifeCycle    48
Sigma    5

การใช้ก็เพียงพิมพ์ ReadPar[“input.in”] โดยคำตอบที่ได้จะเป็น

{2.3*10^11, 48, 10, 5}

การรวมMS Excel sheets ไว้ในหน้าเดียวกันด้วย Mathematica

นักสถิติคนหนึ่งส่งไฟล์ข้อมูลที่เก็บใน Excel มาให้ เพราะต้องการให้รวมข้อมูลที่มีหลาย sheets โดยที่แต่ล่ะ sheet จะมี header เหมือนกันไว้ใน sheet เดียวกันเพื่อความสะดวกในการนำไปใช้ในโปรแกรมสถิติตัวอื่นเช่น STATA หรือ R วิธีที่ผมทำก็ง่ายมากเลยครับ ผมก็ให้ Mathematica อ่านข้อมูลเข้ามาทีล่ะ sheet ด้วยคำสั่ง Import เอามาต่อๆกันแล้วก็ Export มันออกมาเป็นไฟล์ใหม่ครับ ดูตัวอย่างด้านล่างครับ

(* เปลี่ยนFolderไปที่ไฟล์ข้อมูลเก็บอยู่ เช่นที่ d:/works*)
SetDirectory[“d:/works”];

(*อ่านข้อมูลทั้งหมดเข้ามาใน Mathematica พร้อมกับใช้ Flatten เพื่อเรียงข้อมูลใหม่*)
dat = Flatten[Import[“data.xlsx”, {“Data”}],1];

(* จากนั้นก็สร้างไฟล์ใหม่ขึ้นมา  *)
Export[“newdata.xlsx”, dat,”XLSX”]

การอ่านไฟล์ Excel (.XLS, .XLSX) ด้วยคำสั่ง Import นั้นสามารถที่จะระบุตำแหน่งใน sheet และหมายเลขหรือชื่อของ sheet ได้ครับ สะดวกมากๆ
ดูรายละเอียดเพิ่มเติมได้ที่  http://reference.wolfram.com/mathematica/ref/format/XLSX.html

ลองดูที่นี่เพิ่มเติมครับ ผมเขียนเป็นappง่ายไว้ใช้ออนไลน์ครับ

http://www.sakngoi.com/2018/06/13/รวมชีทไฟล์-xlsx-แบบง่ายๆ/

%d bloggers like this: