三阶行列式计算图解如何画?

发布于 2025-07-12 20:38:51
关注者
0
被浏览
180
4 个回答
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

maybe duplicated

https://ask.latexstudio.net/ask/question/17406.html


建议你先学着改改。实在不行,请补充你尝试的最小工作示例到原问题。

Thallo
Thallo 2天前
这家伙不懒,但还是什么也没写
\documentclass[border=5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, calc}
\begin{document}
\tikzset{every matrix/.style={matrix of math nodes, left delimiter=|, right delimiter=|, column sep=1.5em, row sep=1.5em, nodes={inner sep=0.3ex}}}
\newcommand{\mycenter}[4]{ \path (#1)--coordinate[pos=0.5](a)(#2) (#1)--coordinate[pos=0.5](b)(#3); \coordinate (#4) at (b-|a); }
\begin{tikzpicture}[rounded corners, text=black, draw=gray!70]
\matrix (Mb) {
a_{11} & a_{12} & a_{13} \\ 
a_{21} & a_{22} & a_{23} \\ 
a_{31} & a_{32} & a_{33} \\ 
};

\draw[red] (Mb-1-1)--(Mb-2-2)--(Mb-3-3);
\mycenter{Mb-1-2}{Mb-1-3}{Mb-2-2}{myc} \mycenter{Mb-2-2}{Mb-2-3}{Mb-3-2}{myc2}
\draw[red] (Mb-1-2)--(Mb-2-3)--($(Mb-3-2)!2!(Mb-3-3)$)--($(myc)!3!(myc2)$) coordinate(x2)--(Mb-3-1);
\coordinate (a14) at ($(Mb-1-2)!2!(Mb-1-3)$); \mycenter{Mb-1-3}{a14}{Mb-2-3}{myd} \coordinate (myd2) at (myc2 -| myd);
\draw[red] (Mb-2-1)--(Mb-3-2)--($(myd)!3!(myd2)$) coordinate(x1)--($(Mb-3-2)!3!(Mb-3-3)$)--(Mb-1-3);

\draw[densely dashed,blue] (Mb-1-3)--(Mb-2-2)--(Mb-3-1);
\coordinate (x3) at ($(x1)!2!(x2)$); \coordinate (x4) at ($(x1)!3!(x2)$);
\draw[densely dashed,blue] (Mb-1-2)--(Mb-2-1)--($(Mb-3-2)!2!(Mb-3-1)$)--(x3)--(Mb-3-3);
\draw[densely dashed,blue] (Mb-2-3)--(Mb-3-2)--(x4)--($(Mb-3-2)!3!(Mb-3-1)$)--(Mb-1-1);
\end{tikzpicture}

\end{document}

image.png


image.png

一模一样的问题,图都是一样的

https://www.zhihu.com/question/525613625/answer/2420699577

image.png

寄存器
寄存器 20小时前
这家伙很懒,什么也没写!

用TikZ的matrix库结合tkz-euclide宏包作了一个实现,代码不够优雅,希望大家一起讨论。

\documentclass{article}
\usepackage{tkz-euclide}
\usetikzlibrary{positioning}
\usetikzlibrary{matrix}

% 将TikZ坐标名称转换为tkz坐标名称
\newcommand{\CopyPointToTKZ}[2]{%
  \path (#1);
  \pgfgetlastxy{\macrox}{\macroy}
  \pgfmathsetmacro{\macroxcm}{\macrox/1cm}
  \pgfmathsetmacro{\macroycm}{\macroy/1cm}
  \tkzDefPoint(\macroxcm,\macroycm){#2}
}

\begin{document}
  \begin{tikzpicture}
    \node (d) at (0,0) {$D=$};
    \matrix (m) [%
        matrix of math nodes,
        nodes in empty cells,
        left delimiter=|,
        right delimiter=|,
        nodes={anchor=center,minimum size=2em},
        right= 0.1 of d, % 应该使用相对坐标
      ] {%
        a_{11} & a_{12} & a_{13}\\
        a_{21} & a_{22} & a_{23}\\
        a_{31} & a_{32} & a_{33}\\
      };
    % \draw (m-1-1.center) rectangle (m-3-3.center);

    % 将TikZ坐标标记转换为tkz坐标标记
    \foreach \i in {1,2,...,3}{%
      \foreach \j in {1,2,...,3}{%
        \CopyPointToTKZ{m-\i-\j.center}{M_\i_\j}
      }
    }

    % 定义主对角线方向的平行线及求各个交点
    \foreach \i [count=\j from 4] in {2,3}{%
      \tkzDefLine[parallel=through M_1_\i](M_1_1,M_3_3)
      \tkzGetPoint{p}
      \tkzInterLL(M_1_\i,p)(M_3_1,M_3_3)
      \tkzGetPoint{M_3_\j}
    }

    \foreach \i [count=\j from 4, count=\k from 3] in {3,2}{%
      \tkzDefLine[parallel=through M_\i_1](M_1_1,M_3_3)
      \tkzGetPoint{p}
      \tkzDefLine[parallel=through M_3_\j](M_3_1,M_1_3)
      \tkzGetPoint{q}
      \tkzInterLL(M_3_\j,q)(M_\i_1,p)
      \tkzGetPoint{M_4_\k}
    }

    % 定义副对角线方向的平行线及求各个交点
    \foreach \i [count=\j from 6] in {1,2}{%
      \tkzDefLine[parallel=through M_1_\i](M_3_1,M_1_3)
      \tkzGetPoint{p}
      \tkzInterLL(M_1_\i,p)(M_3_1,M_3_3)
      \tkzGetPoint{M_3_\j}
    }

    \foreach \i [count=\j from 6, count=\k from 1] in {2,3}{%
      \tkzDefLine[parallel=through M_\i_3](M_3_1,M_1_3)
      \tkzGetPoint{p}
      \tkzDefLine[parallel=through M_3_\j](M_1_1,M_3_3)
      \tkzGetPoint{q}
      \tkzInterLL(M_3_\j,q)(M_\i_3,p)
      \tkzGetPoint{M_4_\k}
    }

    % 绘制主对角线方向
    \foreach \i [count=\j from 3] in {1,2,3}{%
      \tkzDrawSegment[thick, red](M_1_\i,M_3_\j)
    }
    \foreach \i [count=\j from 3] in {3,2}{%
      \tkzDrawSegment[thick, red](M_\i_1,M_4_\j)
    }
    \foreach \i [count=\j from 3] in {4,5}{%
      \tkzDrawSegment[thick, red](M_3_\i,M_4_\j)
    }

    % 绘制副对角线方向
    \foreach \i [count=\j from 6] in {1,2}{%
      \tkzDrawSegment[thick, blue, dashed](M_1_\i,M_3_\j)
    }
    \tkzDrawSegment[thick, blue, dashed](M_1_3,M_3_1)
    \foreach \i [count=\j from 1] in {2,3}{%
      \tkzDrawSegment[thick, blue, dashed](M_\i_3,M_4_\j)
    }
    \foreach \i [count=\j from 1] in {6,7}{%
      \tkzDrawSegment[thick, blue, dashed](M_3_\i,M_4_\j)
    }
  \end{tikzpicture}
\end{document}

实现结果如下:
image.png

Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

借楼:

在QQ群中恰有一位朋友的类似需求如下:

image.png

这里总结一些我的尝试和搜罗到的解答,也希望@u78 老师能做点补充:

方法一

尝试基于tikzmatrix库,利用网格化的node定位确保平行...但缺陷也是有的,不好方便地控制「斜线倾斜的角度」

\documentclass[tikz,border=3pt]{standalone}
\usepackage{amsmath}
\usepackage{newpxmath}
\usetikzlibrary{matrix}
\usetikzlibrary{ext.positioning-plus}
\newcommand\blind{\phantom{a_{11}}}
\begin{document}
\begin{tikzpicture}[line cap=round]
    \matrix (det) [matrix of math nodes,nodes={circle}]
    {
    \blind & \blind & a_{11} & a_{12} & a_{13} & \blind & \blind \\
    \blind & \blind & a_{21} & a_{22} & a_{23} & \blind & \blind \\ 
    \blind & \blind & a_{31} & a_{32} & a_{33} & \blind & \blind \\
    \blind & \blind & \blind & \blind & \blind & \blind & \blind \\
    };
    \draw[blue,dashed,thick] (det-1-3.center) -- (det-3-1.center) -- (det-4-3.ext_corner south west) -- (det-2-5.center);
    \draw[blue,dashed,thick] (det-1-4.center) -- (det-3-2.center) -- (det-4-4.ext_corner south west) -- (det-3-5.center);
    \draw[blue,dashed,thick] (det-1-5.center) -- (det-3-3.center);
    \draw[red,thick] (det-1-4.center) -- (det-3-6.center) -- (det-4-5.ext_corner south west) -- (det-3-3.center);
    \draw[red,thick] (det-1-5.center) -- (det-3-7.center) -- (det-4-6.ext_corner south west) -- (det-3-4.center);
    \draw[red,thick] (det-1-3.center) -- (det-3-5.center);
    \draw[thick]
    (det-1-3.ext_corner north west) -- (det-3-3.ext_corner south west)
    (det-1-5.ext_corner north east) -- (det-3-5.ext_corner south east)
    ;
\end{tikzpicture}
\end{document}

image.png

方法二

基于nicematrix\CodeAfter.
感谢@u98900 提出的思路:为了避免使用「绝对坐标」调整,使用calc计算「差向量」来辅助定位以保证绝对的平行.

\documentclass{article}
\usepackage{newpxmath}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\setlength{\extrarowheight}{1mm}
\[
D = \begin{vNiceMatrix}
    a_{11} & a_{12} & a_{13}\\
    a_{21} & a_{22} & a_{23}\\
    a_{31} & a_{32} & a_{33}\\
    \CodeAfter
    \begin{tikzpicture}[line cap=round]
        \coordinate (vec1) at ($(3-3.center)-(1-1.center)$);
        \coordinate (vec2) at ($(3-1.center)-(1-3.center)$);
        \draw[blue,dashed,thick] (1-3.center) -- (3-1.center);
        \draw[blue,dashed,thick] (1-1.center) -- ++(vec2) -- ++($.75*(vec1)$) -- (2-3.center);
        \draw[blue,dashed,thick] (1-2.center) -- ++(vec2) -- ++($.75*(vec1)$) -- (3-3.center);
        \draw[red,thick] (1-1.center) -- (3-3.center);
        \draw[red,thick] (1-2.center) -- ++(vec1) -- ++($.75*(vec2)$) -- (3-1.center);
        \draw[red,thick] (1-3.center) -- ++(vec1) -- ++($.75*(vec2)$) -- (2-1.center);
    \end{tikzpicture}
\end{vNiceMatrix}
\]

\end{document}

image.png

Edited:

耿楠老师曾经说过:

一锤子买卖的话,没必要用代码,咋画都行。
如果后期需要维护,需要微调,需要大量复制,我建议还是上代码。
如果追求的是自由和乐趣,那就用代码思考人生。

基于nicematrix做了一点小小的自动化,如下:

% https://ask.latexstudio.net/ask/question/17826.html
\documentclass{article}
\usepackage{newpxmath}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\pagestyle{empty}
\setlength{\extrarowheight}{1.5mm}
\ExplSyntaxOn
\def\N{8}
\def\ratio{\fpeval{\N/(2*(\N-1))}}
\[
\begin{vNiceMatrix}
    % \c_math_subscript_token
    \int_step_inline:nn {\N} {%
        a\c_math_subscript_token{#11}%
        \int_step_inline:nnn {2}{\N} {%
            & a\c_math_subscript_token{#1{##1}}%
        }%
        \int_compare:nNnTF {#1} < {\N} {\\} {}%
    }%
    \CodeAfter%
    \begin{tikzpicture}[line~cap=round]
        % 定义主/副对角线的向量
        \coordinate (main-vec) at ($(\N-\N.center)-(1-1.center)$);
        \coordinate (secondary-vec) at ($(\N-1.center)-(1-\N.center)$);
        % 处理副对角线方向的其他 \N-1 条虚线
        \draw[orange,dashed,thick] (1-\N.center) -- (\N-1.center);
        \int_step_inline:nn {\N-1} {
            \draw[orange,dashed,thick,rounded~corners=5mm] (1-#1.center) --++(secondary-vec) --++($\ratio*(main-vec)$) -- (\int_eval:n{#1+1}-\N.center);
        }
        % 处理主对角线方向的其他 \N-1 条实线
        \draw[magenta,thick] (1-1.center) -- (\N-\N.center);
        \int_step_inline:nn {\N-1} {
            \draw[magenta,thick,rounded~corners=5mm] (1-\int_eval:n{#1+1}.center) --++(main-vec) --++($\ratio*(secondary-vec)$) -- (\int_eval:n{\N-#1+1}-1.center);
        }
    \end{tikzpicture}
    \end{vNiceMatrix}
\]
\ExplSyntaxOff 
\end{document}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览