6

I am looking to produce a matrix multiplication where one of the matrices consists of coloured blocks. Much like: enter image description here

Is there any way to produce something like this in Latex?

3 Answers 3

6

I did this with stacks. Unfortunately, there is some tailoring that one must do, depending on the arrangement of boxes, so each particular image must be thought through. The \colblock[color]{rows}{content} is the basic unit. \belowbaseline[length]{} is used in \colblock to align boxes at their top. That and \belowbaseline[length]{} can be used in the code to shift/align boxes. Passing either of them a multiple of \baselineskip would allow some staggering in the vertical box placement.

If the \colblocks are allowed to be rectangular (I assumed square), let me know so that I may correct the answer.

\documentclass{article} \usepackage{stackengine} \usepackage{xcolor} \usepackage{calc} \newlength\mytemp \newlength\myoffset \myoffset=.5\ht\strutbox \newcommand\colblock[3][blue!20]{% \setlength\mytemp{#2\baselineskip}% \setlength\mytemp{.5\mytemp-\myoffset}% \belowbaseline[0pt]{% \fboxsep=-\fboxrule\fbox{\colorbox{#1}{\rule[-\mytemp]{0ex}{#2\baselineskip}% \makebox[#2\baselineskip]{$#3$}}}% }} \begin{document} \[ \parenVectorstack{b_1 b_2 . . . . . b_n} = \left( \raisebox{4\baselineskip+.5\myoffset}{% \def\stackalignment{l}\stackunder[0pt]{\colblock{2}{-2}\colblock{2}{-2}}% {\colblock{6}{-1}\colblock[red!15]{4}{1}}% }% \right) \parenVectorstack{a_1 a_2 . . . . . a_n} \] \end{document} 

enter image description here

7

A solution that uses tikz, but hides it in markup:

\begin{blockmatrix} \block[blue](0,0)text(2,2) \end{blockmatrix} 

Draws a block with color blue at position (0,0) with size (2,2) and "text" in the middle. Thus different colors and rectangles are supported.

\documentclass{article} \usepackage{amsmath} \usepackage{xcolor} \usepackage{tikz} \usetikzlibrary{calc} \definecolor{block}{RGB}{0,162,232} \newenvironment{blockmatrix}{% \left(% \vcenter\bgroup\hbox\bgroup \tikzpicture[ x=1.5\baselineskip, y=1.5\baselineskip, ]% }{% \endtikzpicture \egroup \egroup \right)% } % \block[#1](#2,#3)#4(#5,#6) % #1: fill color % (#2,#3): lower left corner % #4: text in the middle % (#5,#6): size of the block \newcommand*{\block}[1][block]{% \blockaux{#1}% } \def\blockaux#1(#2,#3)#4(#5,#6){% \draw[fill={#1}] let \p1=(#2,#3), \p2=(#5,#6), \p3=(#2+#5,#3+#6), \p4=(#2+#5/2,#3+#6/2) in (\p1) rectangle (\p3) (\p4) node {$#4$} ;% } \begin{document} \[ \begin{pmatrix}b_1\\b_2\\\vdots\\b_n\end{pmatrix} = \begin{blockmatrix} \block(0,0)-1(3,3) \block(3,1)1(2,2) \block[yellow](0,3)-2(1,1) \block[green](1,3)2(1,1) \end{blockmatrix} \begin{pmatrix}a_1\\a2\\\vdots\\a_n\end{pmatrix} \] \end{document} 

Result

1

With {pNiceMatrix} of nicematrix.

\documentclass{article} \usepackage{nicematrix} \begin{document} $ \renewcommand{\arraystretch}{1.6} \begin{pmatrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{pmatrix} = \begin{pNiceMatrix}[margin,columns-width=auto] \Block[fill=red!15,draw]{1-1}{-2} & \Block[fill=green!20,draw]{1-1}{2} & & & \\ \Block[fill=blue!15,draw]{3-3}{-1} & & & \Block[fill=blue!15,draw]{2-2}{1} & \\ & & & & \\ & & & & \\ \end{pNiceMatrix} \begin{pmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{pmatrix} $ \end{document} 

You need several compilations (because nicematrix uses PGF/Tikz nodes under the hood).

Output of the above code

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.