จงเชื่อคำเตือนของ MATLAB

ผมเองรู้เรื่องตัวแปรที่ไม่ต้องกำหนดขนาดก่อนใช้งานมานานแล้ว ซึ่งเป็นที่รู้กันดีว่าการใช้ตัวแปรแบบนี้มันทำให้โปรแกรมทำงานช้าลง แต่ไม่เคยรู้มาก่อนเลยว่ามันจะช้าขนาดนี้

ผมจำเป็นต้องวาดกราฟของการลู่เข้าของค่าพารามิเตอร์ซึ่งมีประมาณ 2 หมื่นค่า อาจจะสร้างเล่น ๆ ได้ดังนี้

theta = [];

for ii = 1:20000
theta(1:20,ii) = rand(20,1);
end

ลองรันชุดคำสั่งข้างบนดู จะพบว่าลุกไปกินกาแฟหรือเข้าห้องน้ำตัวโปรแกรมก็อาจจะยังทำงานไม่เสร็จ มาลองแก้ไขชุดคำสั่งข้างบน โดยเพิ่มบรรทัดขึ้นอีกหนึ่งบรรทัด (การเพิ่มคำสั่งเข้าไปน่าจะทำให้โปรแกรมทำงานช้าลง) ดังนี้

theta = [];

theta = zeros(20,20000);
for ii = 1:20000
theta(1:20,ii) = rand(20,1);
end

ลองรันชุดคำสั่งที่สองดู ยังไม่ทันกระพริบตาก็เสร็จแล้ว ซึ่งชุดคำส่งแรกใช้เวลาประมาณ 170 วินาที เกือบ ๆ สามนาที ในขณะที่ชุดคำสั่งที่สองใช้เวลาเกือบ 0.1 วินาที ซึ่งต่างกันมากทีเดียว

ก็ไม่แปลก เพราะเวลาไม่ได้กำหนดขนาดของอะเรย์ เวลามีการขยายหรือทำอะไรกับมัน ย่อมน่าจะมีกระบวนการต่าง ๆ พอสมควร (ผมไม่รู้และไม่สนใจ) แต่ที่แปลกคือมันต่างกันขนาดนี้เลยเหรอ ดังนั้นแล้วเวลาใช้งาน MATLAB ก็ควรจะใส่ใจต่อคำเตือนของ IDE ของ MATLAB ด้วย

Advertisements

มาฆ่า eps ให้ตายกันดีกว่า

ความจำเป็นในการใช้ format eps นั้นคืออะไรหรือ ฆ่ามันให้ตายซะ มันเป็นตัวปัญหาซะมากกว่า ไร้สาระถ้าจะคงไว้เพื่อ pstricks ยกเลิกซะแล้วหันไปพัฒนา pgf กันเถอะ ทำไมเราจะต้องทำแบบ xfig ที่จะต้องสร้างรูปแบบ eps หรือ pdf จากนั้นก็สร้าง LaTeX ไฟล์คร่อมมัน ทำไมเราไม่ทำทุกอย่างเป็นคำสั่งแบบ pgf

เลิกใช้ xfig กันเถอะ

Very fat matrices (Matrix with more than 10 columns)

ใน amsmath นั้นกำหนดค่าสำหรับคอลัมน์สำหรับคำสั่งในการสร้างเมตริกซ์ไว้แค่ 10 คอลัมน์เท่านั้น
การจะเพิ่มจำนวนคอลัมน์นั้นทำได้โดยการกำหนดค่า MaxMatrixCols ให้เกินสิบ ดังนี้

\setcounter{MaxMatrixCols}{20}

เป็นอันเสร็จเรื่อง

Why shouldn’t use determinant to check the singularity of matrices

เป็นที่รู้กันมาตั้งแต่ชั้นมัธยมแล้วว่าเราจะหาส่วนกลับของเมตริกซ์ได้ก็ต่อเมื่อค่า determinant ไม่
เท่ากับเมตริกซ์ 0 พอเรียนสูงขึ้นเขาก็บอกว่าไม่ให้ทำแบบนี้นะ เพราะสภาวะทางตัวเลขที่คำนวณ
ด้วย determinant นั้นไม่ดี ให้ตรวจสอบด้วย Rank และการหา Rank ของเมตริกซ์ที่ดีที่สุดก็ให้ใช้
Singular Value Decomposition ซึ่งเมตริกซ์ที่จะหาส่วนกลับได้นั้นจะต้อง full Rank

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

     3825       -1713       -1061        -497         710        -502       -3471      3136
    -1713        3834       -1632         161        -527         722        -412      -3561
     -1061       -1632        4563         983        -109       -419       4004      -1222
      -497         161         983         315        -178          23           832     -978
        710        -527        -109        -178         415        -218         -29       1132
      -502         722        -419          23        -218         431          55        -149
     -3471        -412        4004         832         -29          55        6640     -1265
      3136       -3561       -1222        -978        1132        -149     -1265     7539

ค่า determinant ของตัวเลขชุดนี้คือ –54413 นั่นหมายความว่าเราต้องหาส่วนกลับของเมตริกซ์
ตัวนี้ได้สิ แต่ไม่ใช่เลย ถ้าใช้คำสั่ง rank ใน MATLAB เราจะได้ 7 ซึ่งเมตริกซ์ไม่ full rank ถ้าใช้
svd หา จะได้ rank เป็น 6 หมายความว่าเมตริกซ์นี้หาส่วนกลับไม่ได้

เชื่อแล้วครับผม

ปล. ถ้าคิดด้วยมือ determinant จะไม่ผิดนะครับ