I need to write a complicated matrix, that has a structure as in the attached picture.
[Tex/LaTex] bordermatrix with blocks
arraysbordermatrixmatricestables
Related Solutions
The result can be achieved by using the OP's code and the linked answers e.g. using:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[baseline = (M.center),% center with respect to the matrix center
every left delimiter/.style={xshift=1ex},%tighter delimiter spacing
every right delimiter/.style={xshift=-1ex}]
\matrix (M) [matrix of nodes,left delimiter={(},right delimiter={)},nodes in empty cells
]{
|[draw,circle,inner sep=3mm,fill]| & \\
& |[draw,circle,inner sep=6mm,fill]|\\
};
\node[anchor=south east, left=6pt] (M-0-0) at (M-1-1.north west) {};
% iterate over each row and their corresponding labels
\foreach[count=\i] \v in {\(A\),\(B\)}{
% label of this row, based on size of diagonal element
\node (M-\i-0) at (M-0-0 |- M-\i-\i) {};
% put the text (specified in the loop) at the label
\path (M-\i-0.north) -- (M-\i-0.south) node [midway, left] { \v };
}
\end{tikzpicture}
\end{document}
gives
A possibility using TikZ and matrix of math nodes
(from the matrix
library) to build the natrices; the braces for the dimensions were built using a brace
decoration from the decorations.pathreplacing
library:
\documentclass{article}
\usepackage{tikz}
\usepackage{geometry}
\usetikzlibrary{matrix,positioning,decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[
style1/.style={
matrix of math nodes,
every node/.append style={text width=#1,align=center,minimum height=5ex},
nodes in empty cells,
left delimiter=[,
right delimiter=],
},
style2/.style={
matrix of math nodes,
every node/.append style={text width=#1,align=center,minimum height=5ex},
nodes in empty cells,
left delimiter=\lbrace,
right delimiter=\rbrace,
}
]
\matrix[style1=0.65cm] (1mat)
{
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
};
\draw[dashed]
(1mat-3-5.south west) -- (1mat-3-6.south east);
\draw[loosely dashed]
(1mat-5-1.south west) -- (1mat-5-6.south east);
\draw[dash dot]
(1mat-1-4.north east) -- (1mat-8-4.south east);
\draw[]
(1mat-5-2.south east) -- (1mat-8-2.south east);
\node[font=\huge]
at ([xshift=-10pt]1mat-3-3) {$A_{1}$};
\node[font=\Large]
at (1mat-2-5.east) {$0$};
\node[font=\Large]
at (1mat-5-5.north east) {$A_{2}$};
\node[font=\Large]
at (1mat-7-5.east) {$B_{2}$};
\node[font=\Large]
at (1mat-7-1.east) {$0$};
\node[font=\Large]
at (1mat-7-3.east) {$B_{1}$};
\draw[decoration={brace,mirror,raise=12pt},decorate]
(1mat-1-1.north west) --
node[left=15pt] {$n_{1}$}
(1mat-5-1.south west);
\draw[decoration={brace,mirror,raise=12pt},decorate]
(1mat-6-1.north west) --
node[left=15pt] {$n_{2}$}
(1mat-8-1.south west);
\draw[decoration={brace,mirror,raise=5pt},decorate]
(1mat-8-3.south west) --
node[below=7pt] {$n_{2}$}
(1mat-8-4.south east);
\draw[decoration={brace,mirror,raise=5pt},decorate]
(1mat-8-5.south west) --
node[below=7pt] {$n_{2}$}
(1mat-8-6.south east);
\draw[decoration={brace,raise=12pt},decorate]
(1mat-4-6.north east) --
node[right=15pt] {$n_{2}$}
(1mat-5-6.south east);
\draw[decoration={brace,raise=7pt},decorate]
(1mat-1-1.north west) --
node[above=8pt] {$n_{1}$}
(1mat-1-4.north east);
\matrix[style2=1.2cm,right=40pt of 1mat] (2mat)
{
Q_{1} \\
\vdots \\
Q_{n_{1} - n_{2}} \\
\vdots \\
Q_{n_{1}} \\
R_{1} \\
\vdots \\
R_{n_{2}} \\
};
\draw[dashed]
(2mat-3-1.south west) -- (2mat-3-1.south east);
\draw[loosely dashed]
(2mat-5-1.south west) -- (2mat-5-1.south east);
\node at ([xshift=17pt,yshift=-1.2pt]2mat.east) {$=$};
\matrix[style2=0.7cm,right=35pt of 2mat] (3mat)
{
0 \\
\vdots \\
\\
\vdots \\
0 \\
b_{1} \\
\vdots \\
b_{n_{2}} \\
};
\draw[loosely dashed]
(3mat-5-1.south west) -- (3mat-5-1.south east);
\end{tikzpicture}
\end{document}
Perhaps you should consider whether there's another way to display the information? Removing the braces with the dimensions and using a single dashed style improves the result:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning,decorations.pathreplacing}
\begin{document}
\[
\begin{tikzpicture}[
style1/.style={
matrix of math nodes,
every node/.append style={text width=#1,align=center,minimum height=5ex},
nodes in empty cells,
left delimiter=[,
right delimiter=],
},
style2/.style={
matrix of math nodes,
every node/.append style={text width=#1,align=center,minimum height=5ex},
nodes in empty cells,
left delimiter=\lbrace,
right delimiter=\rbrace,
}
]
\matrix[style1=0.85cm] (1mat)
{
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
& & & & & \\
};
\draw[dashed]
(1mat-3-5.south west) -- (1mat-3-6.south east);
\draw[dashed]
(1mat-6-1.south west) -- (1mat-6-6.south east);
\draw[dashed]
(1mat-1-4.north east) -- (1mat-9-4.south east);
\draw[dashed]
(1mat-6-2.south east) -- (1mat-9-2.south east);
\node[font=\huge]
at (1mat-3-2.south east) {$A_{1}$};
\node[font=\Large]
at (1mat-2-5.east) {$0$};
\node[font=\Large]
at (1mat-5-5.east) {$A_{2}$};
\node[font=\Large]
at (1mat-8-5.east) {$B_{2}$};
\node[font=\Large]
at (1mat-8-1.east) {$0$};
\node[font=\Large]
at (1mat-8-3.east) {$B_{1}$};
\matrix[style2=1.2cm,right=40pt of 1mat] (2mat)
{
Q_{1} \\
\vdots \\
Q_{n_{1} - n_{2}} \\
Q_{n_{1} - n_{2}+1} \\
\vdots \\
Q_{n_{1}} \\
R_{1} \\
\vdots \\
R_{n_{2}} \\
};
\draw[dashed]
(2mat-3-1.south west) -- (2mat-3-1.south east);
\draw[dashed]
(2mat-6-1.south west) -- (2mat-6-1.south east);
\node at ([xshift=17pt,yshift=-1.2pt]2mat.east) {$=$};
\matrix[style2=0.7cm,right=35pt of 2mat] (3mat)
{
0 \\
\vdots \\
\\
\\
\vdots \\
0 \\
b_{1} \\
\vdots \\
b_{n_{2}} \\
};
\draw[dashed]
(3mat-6-1.south west) -- (3mat-6-1.south east);
\end{tikzpicture}
\]
\end{document}
Best Answer
The
blkarray
package allows to do complex border matrix with relatively simple code: