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 จะไม่ผิดนะครับ

Beamer : Handout Print

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

\usepackage{pgfpages}
\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

ตัวเลข 2 on 1 นั้นก็ชัดเจนครับ จะเปลี่ยนเป็น 4 on 1 ก็ได้  ซึ่งถ้าเป็น 4 on 1
ก็ให้ใส่ตัวเลือก landscape เพิ่มเข้าไปด้วย

\usepackage{pgfpages}
\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm,landscape]

เนื่องจากในบางกรณีการยกเลิก overlay จะทำให้เกิดปัญหาสำหรับบางหน้า  วิธีแก้ปัญหาดูได้จาก http://www.tug.org/pipermail/texhax/2008-July/010666.html

\onslide<1| handout:0>\includegraphics{fig}

ซึ่งไอ้ตัว | handout:0 จะไปยกเลิกข้อความหรือรูปนั้น ๆ ออกไปในโหมด handout ข้อควรระวังคือต้องมีช่องว่างหนึ่งช่องว่างหลังเครื่องหมาย | เสมอ

ลองแล้วครับดีมาก ๆ

function reshape ของ MATLAB

เป็นฟังก์ชันที่ถ้าใช้บ่อยแล้วจะดี เพราะการกระทำใด ๆ ในรูปเมตริกซ์โดยการหลีกเลี่ยงการใช้
การวนลูปแล้วกระทำกับตัวเลขทีละตัวจะทำให้การคำนวณโดยใช้ MATLAB เร็วขึ้น

ปัญหาของผมคือผมมีข้อมูล

reshape1

ผมต้องการให้เป็นแบบนี้

reshape2 ในคู่มือของ MATLAB บอกว่าให้ใช้คำสั่ง reshape ซึ่งมีวิธีการใช้ดังนี้

B = reshape(A,m,n)
โดยที่ A คือเมตริกซ์ที่ต้องการจะทำการเปลี่ยนแปลง
m และ n คือจำนวนแถวและหลัก

ถ้าผมใช้ B = reshape(y,[],1)  ผมจะได้

reshape3.

ซึ่งไม่ใช่สิ่งที่ต้องการ คิดอยู่ต้องนานว่าจะทำอย่างไร สรุปว่าก็แค่ B = reshape(y’,[],1) นั่นก็
คือทำการ transpose ก่อนนั่นเอง

 

 

Defining the Color of Lines for Plotting

ผู้ใช้ MATLAB จะมีความรู้สึกร่วมกันอยู่อย่างหนึ่งคือ คู่มือไม่ดี วันนี้เพื่อนมาถามปัญหาที่ค้างคาใจ
อยู่นาน ซึ่งปัญาคือ

ต้องการพล็อตกราฟ โดยพล็อตกราฟทีละสิบข้อมูล โดยในแต่ละข้อมูลจะต้องมีสีต่างกัน

ไม่เคยทำนะครับ อย่างเก่งผมก็แค่พล็อตทีละสองหรือสามข้อมูลแล้วให้ MATLAB กำหนดสีให้เอง
ซึ่งจะใช้วิธีถึก ๆ ดังนี้

plot(x,y1,x,y2)

MATLAB ก็จะเลือกสีให้ ถ้าข้อมูลเพิ่มเป็นซักสามสิบหล่ะ คือมี y1 ถึง y10 ไอ้การทำแบบข้างบนนั้น
มันไม่ได้ซะแล้ว ที่สำคัญสีที่ให้โดยอัตโนมัตินั้นมีแค่ 8 สีเอง ซึ่งหนึ่งในนั้นเป็นสีขาว

เรามาเริ่มต้นทำความเข้าใจว่าเราจะพล็อตข้อมูล y1 ถึง y10 ในคราวเดียวได้อย่างไรก่อน วิธีการก็
ทำการสร้างเมตริกซ์ของข้อมูลที่จะพล็อต ตัวอย่างเช่น

x = 0:pi/20:4*pi;
A = ones(length(x),10);   % กำหนดขนาดของเมตริกซ์เพื่อเพิ่มความเร็วในการคำนวณ
for i = 1:10
A(:,i) = sin(x-i/5)’;      % เก็บข้อมูลเป็นเวกเตอร์ในคอลัมน์ของเมตริกซ์ A
end

plot(x,A);

ผลที่ได้จะเห็นได้อย่างชัดเจนว่าเริ่มมีสีซ้ำกัน ทางแก้ก็คือกำหนดสีให้ MATLAB ใหม่ดังนี้

C = zeros(10,3);

for i = 1:10
C(i,1) = 0.1*i;
end
set(gcf,’DefaultAxesColorOrder’,C);

แล้วก็ตามด้วยคำสั่งในการพล็อตกราฟข้างต้น

ผลลัพธ์ที่ได้จะเป็นดังข้างบน

และแน่นอนเราหาทางกลับไม่เจอหรอก ต้องพลิกคู่มืออีกหลายตลบแล้วก็ลองผิดลองถูก จริง ๆ ก็แค่

reset(gcf); หรือ set(gcf,’default’);

ทุกอย่างก็จะกลับไปเหมือนเดิม

หมายเหตุ: ทุกอย่างเอามาจากคู่มือของ MATLAB ทั้งหมด

function exist

ใช้ MATLAB มาหลายปีแล้ว พึ่งจะเจอปัญหา กล่าวต้องการตรวจสอบว่าถ้ามีตัวแปร
นี้อยู่แล้วบน Workspace ไม่ต้องเรียนฟังก์ชันนั้นมาคำนวณ เพราะมันเสียเวลาเนื่อง
จากข้อมูลจากฟังก์ชันดังกล่าวคงที่ไม่มีการเปลี่ยนแปลง และเสียเวลามากถ้าจะรัน
หนึ่งครั้ง

MATLAB มีคำสั่งง่าย ๆ เพื่อตรวจสอบข้อมูลต่าง ๆ บน Workspace ว่ามีอยู่หรือไม่
โดยใช้คำสั่ง exist ซึ่งใช้ร่วมกัน if … then ได้ง่ายมาก เช่นต้องการจะตรวจสอบว่ามี
ตัวแปรชื่อ K อยู่บน Workspace หรือไม่ก็ exist(‘K’) ถ้าได้คำตอบเป็น 1 ก็แสดงว่ามี
ตัวแปรนั้นอยู่ ถ้าได้ 0 ก็แสดงว่าไม่มี ง่ายดีจัง