Advanced matrix partitioning (LaTeX)


นาย Raskòlnikov ได้ถามไว้ใน LaTeX Users Group จากเขียนเมตริกซ์ตามในรูปโดยใช้ LaTeX ทำอย่างไร อืมจริง มันซับซ้อนมากเหมือนกัน

https://i1.wp.com/www.lost-prophet.net/storage/genmatrix.jpg

มาเริ่มต้นกับการทำเส้นปะ แบ่งเมตริกซ์ง่าย ๆ กันก่อน ซึ่งสามารถทำได้โดยการใช้ แพ็กเกจ arydshln โดยการสร้างชุดคำสั่งดังนี้

\usepackage{arydshln}
\begin{document}
\begin{align}
\left[\begin{array}{ccccc:cc}
% โคลอนเป็นตัวบอกตำแหน่งของเส้นปะ
0    & 1     &           &          & 0            &      &  \\
&        & \ddots &          & \vdots     &      &  \\
&        &           &  1      & 0            &      &  \\
e_0 & e_1  &          & \cdots & e_{n-1}  &      &   \\\hdashline
&        &          &           &               &  a   &  c  \\
&        &          &           &               &  d   &  e
\end{array}\right]
\end{align}
\end{document}

ซึ่งจะได้เมตริกซ์ลักษณะดังนี้

complexmatrix1

ขั้นต่อไปเป็นการเขียนสัญลักษณ์ให้อยู่ตรงกลางในช่องสี่เหลี่ยมที่เหลือ ซึ่งใช้ความสามารถของแพ็กเกจ multirow โดยในส่วนที่ต้องการขยาย row และ column นั้นให้ทำดังนี้

\multicolumn{ncol}{c}{\multirow{nrow}{*}{$equation$}}

ซึ่งหน้าตามของรหัสต้นที่แก้ไขจะเป็นดังนี้

\begin{align}
\left[
\begin{array}{ccccc:cc}
0 & 1 & & & 0 & \multicolumn{2}{c}{\multirow{4}{*}{$\phi$}} \\
& & \ddots & & \vdots & & \\
& & & 1 & 0 & & \\
e_0 & e_1 & & \cdots & e_{n-1} & & \\\hdashline
\multicolumn{5}{c}{\multirow{2}{*}{$M_1$}} & a & c \\
& & & & & d & e
\end
{array}\right]
\end{align}

ซึ่งจะได้เมตริกซ์หน้าตาแบบนี้

complexmatrix2

ผลที่ได้น่าเกลียดเล็กน้อย จะเห็นว่าเส้นปะตรงมุมด้านขวาล่างนั้นไม่สอดคล้องกับด้านบน ทั้งนี้เพราะตัวแพ็กเกจ arydshln นั้นมีปัญหาเล็กน้อยกับคำสั่ง \multicolumn ทางแก้นั้นง่ายมาก แต่ใช้เวลาคิดนานเหมือนกัน ทางแก้คือเปลี่ยน \multicolumn{5}{c}{\multirow{2}{*}{$M_1$} ไปเป็น & \multicolumn{3}{c}{\multirow{2}{*}{$M_1$} & ก็จะแก้ปัญหาการไม่เข้ากันของคำสั่งได้ ทั้งนี้เป็นปัญหาของการคำนวณ

ขั้นต่อมาคือการทำวงเล็บปีกกาด้านข้างและด้านบน ด้านข้างนั้นไม่ยากเท่าไหร่โดยใช้แพ็กเกจ bigdelim แต่เพื่อความสวยงามแล้ว ผมจึงเลือกให้วิธีปรับด้วยมือดีกว่า ซึ่งสะดวกและได้ผลที่ถูกใจกว่า ส่วนด้านบนก็ทำคล้าย ๆ กัน เรามาดูด้านข้างกันก่อน ก็ทำโดยการสร้าง array ซ้อน array แบบไม่มีวงเล็บ แล้วใช้การสร้างวงเล็บแบบปรับขนาดอัตโนมัติด้วยคำสั่ง \left. \right\} ปรับระยะแนวนอนด้วย \hspace{xcm} และแนวตั้งด้วย [xcm] ทั้งหมดเป็นดังนี้


\hspace{-0.5cm} % ทำหน้าที่เลื่อน array ตัวที่สองให้เข้าไปใกล้เมตริกซ์อันแรก
\hspace{-0.5cm}
\begin
{array}{c}\multirow{4}{*}{$\left.\begin{array}{c} \\[1.6cm] \end{array}\right\} n$}\\  \\   \\   \\[0.2cm]\multirow{2}{*}{$\left.\begin{array}{c} \\[0.4cm] \end{array}\hspace{0.07cm}\right\} m$}   \\   \\  \end{array}

% ใช้คำสั่ง \multirow ในการสร้าง array ใน array อีกชั้นหนึ่ง

ผลที่ได้เป็นดังรูปข้างล่าง

complexmatrix31

ซึ่งจะเห็นว่ามันจะไม่ไปกระทบ array ตัวหลัก

เอาหละเหลือด้านบน ทำได้โดยการสร้าง array เปล่าเหมือนกัน แต่ต้องสร้างก่อนหน้า array ตัวหลัก และใช้ไสยศาสตร์เข้าช่วยในการสร้างช่องว่างที่มองไม่เห็น จริง ๆ ใช้ \hspace ทำก็ได้ แต่เพื่อให้บทความสมบูรณ์ขึ้น ก็เสนอให้ทำโดยใช้ \hphantom{}


\hspace{0.3cm} \overbrace{\hphantom{\begin{array}{ccccc} e_0 & e_1 & \ddots & 1 & e_{n-1} \end{array}}}^{n}\hspace{0.3cm} \overbrace{\hphantom{\begin{array}{cc}a & \end{array}}}^{i}

ท้ายที่สุดจะเห็นได้ว่าเราก็ยังจำเป็นต้องปรับแต่งด้วย \hspace อีกอยู่ดี

complexmatrix4

รหัสต้นทั้งหมด ตามข้างล่างนี้นะครับ (เครื่องหมาย & หน้า \hspace{0.3cm} กับหน้า \left[ นั้นเพื่อเป็นการจัด array ให้เริ่มต้นที่ตำแหน่งเดียวกัน)


\begin{align*}
& \hspace{0.3cm} \overbrace{\hphantom{\begin{array}{ccccc} e_0 & e_1 & \ddots & 1 & e_{n-1} \end{array}}}^{n}\hspace{0.3cm} \overbrace{\hphantom{\begin{array}{cc}a & \end{array}}}^{i}\\
& \left[\begin{array}{ccccc:cc}
0 & 1 & & & 0 & \multicolumn{2}{c}{\multirow{4}{*}{$\phi$}} \\
& & \ddots & & \vdots & & \\
& & & 1 & 0 & & \\
e_0 & e_1 & & \cdots & e_{n-1} & & \\\hdashline
& \multicolumn{3}{c}{\multirow{2}{*}{$M_1$}} & & a & c \\
& & & & & d & e
\end{array}\right]
\hspace{-0.5cm}\begin{array}{c} \multirow{4}{*}{$\left.\begin{array}{c} \\[1.6cm] \end{array}\right\} n$}\\ \\ \\ \\[0.2cm]\multirow{2}{*}{$\left.\begin{array}{c} \\[0.4cm] \end{array}\hspace{0.07cm}\right\} m$} \\ \\ \end{array}
\end{align*}

รหัสต้นของอนุญาติไม่จัดนะครับ

Advertisements

2 comments on “Advanced matrix partitioning (LaTeX)

  1. khan:
    use this package
    \usepackage{arydshln}

    and follow the last block code.

    You can try step by step of block codes.

    By the way you can ask me for the step that you cannot do.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s