You are here: Home // บันทึกช่วยจำ, เทคนิคขั้นสูง // Advanced matrix partitioning (LaTeX)

Advanced matrix partitioning (LaTeX)

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

มาเริ่มต้นด้วยการทำเส้นปะ แบ่งเมตริกซ์ง่าย ๆ กันก่อน ซึ่งสามารถทำได้โดยการใช้ แพ็กเกจ 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$}}

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

\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} และแนวตั้งด้วย \vspace{xcm} ทั้งหมดเป็นดังนี้

\hspace{-0.5cm}     % ทำหน้าที่เลื่อน array ตัวที่สองให้เข้าไปใกล้เมตริกซ์อันแรก
\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*}

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

Tags:

2 Responses to " Advanced matrix partitioning (LaTeX) "

  1. [...] arydshln ดูเรื่อง Advanced matrix partitioning (LaTeX) ซึ่งก็มีปัญหามากพอสมควร [...]

  2. [...] arydshln ดูเรื่อง Advanced matrix partitioning (LaTeX) ซึ่งก็มีปัญหามากพอสมควร [...]

Leave a Reply

Copyright © 2009 Thai LaTeX user group. All rights reserved.
Designed by Theme Junkie. Powered by WordPress.