Categories
Mathematica

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

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

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

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

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

Categories
Mathematica

อ่าน 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}

Categories
Mathematica

การรวม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-แบบง่ายๆ/

Categories
Mathematica

Mathematica 8.0

Mathematica 8.0 เพิ่งเปิดตัวมาได้ไม่นานนี้ มีคุณสมบัติใหม่เพิ่มเข้ามาพอสมควร โดยเฉพาะคุณสมบัติที่ผู้ใช้งานสามารถพิมพ์คำสั่งเป็นประโยคคำพูดแล้วตัวโปรแกรมจะแปลประโยคนั้นเป็นคำสั่งของ Mathematica โดยอัตโนมัตินั้น เป็นคุณสมบัติที่ผมคิดว่าเจ๋งมาก

วิดีโอแนะนำโปรแกรม  Mathematica Quick Tour

ในบ้านเราการใช้งาน Mathematica นี้อยู่ในวงจำกัดมาก เวปที่มีการพูดคุยเกี่ยวกับการใช้งานนี้แบบจริงจังก็มีเพียงของภาควิชาฟิสิกส์ มหาวิทยาลัยมหิดลเท่านั้น (http://mpec.sc.mahidol.ac.th/forums/index.php?board=16.0) ส่วนใครที่กำลังเริ่มต้นเรียนรู้ใช้งานสามารถอ่านคำแนะนำการใช้งานเบื้องต้นของท่านอ.พงศกร สายเพ็ชร์ได้ครับ