Triangle area problem

March 30, 2024 math and physics play , , , , , ,

[Click here for a PDF version of this post]

On LinkedIn, James asked for ideas about how to solve What is the total area of ABC? You should be able to solve this! using geometric algebra.

I found one way, but suspect it’s not the easiest way to solve the problem.

To start with I’ve re-sketched the triangle with the areas slightly more to scale in fig. 1, where areas \( A_1, A_2, A_3, A_5\) are given. The aim is to find the total area \( \sum A_i \).

fig. 1. Triangle with given areas.

 

If we had the vertex and center locations as vectors, we could easily compute the total area, but we don’t. We also don’t know the locations of the edge intersections, but can calculate those, as they satisfy
\begin{equation}\label{eqn:triangle_area_problem:20}
\begin{aligned}
\BD &= s_1 \BA = \BB + t_1 \lr{ \BC – \BB } \\
\BE &= s_2 \BC = \BA + t_2 \lr{ \BB – \BA } \\
\BF &= s_3 \BB = \BA + t_3 \lr{ \BC – \BA }.
\end{aligned}
\end{equation}
Eliminating the \( t_i \) constants by wedging appropriately (or equivalently, using Cramer’s rule), we find
\begin{equation}\label{eqn:triangle_area_problem:40}
\begin{aligned}
s_1 \BA \wedge \lr{ \BC – \BB } &= \BB \wedge \lr{ \BC – \BB } \\
s_2 \BC \wedge \lr{ \BB – \BA } &= \BA \wedge \lr{ \BB – \BA } \\
s_3 \BB \wedge \lr{ \BC – \BA } &= \BA \wedge \lr{ \BC – \BA },
\end{aligned}
\end{equation}
or
\begin{equation}\label{eqn:triangle_area_problem:60}
\begin{aligned}
s_1 &= \frac{\BB \wedge \BC }{\BA \wedge \lr{ \BC – \BB }} \\
s_2 &= \frac{\BA \wedge \BB }{\BC \wedge \lr{ \BB – \BA }} \\
s_3 &= \frac{\BA \wedge \BC }{\BB \wedge \lr{ \BC – \BA }}.
\end{aligned}
\end{equation}
Introducing bivector (signed-area) unknowns
\begin{equation}\label{eqn:triangle_area_problem:80}
\begin{aligned}
\alpha &= \BA \wedge \BB = \begin{vmatrix} \BA & \BB \end{vmatrix} \Be_{12} \\
\beta &= \BB \wedge \BC = \begin{vmatrix} \BB & \BC \end{vmatrix} \Be_{12} \\
\gamma &= \BC \wedge \BA = \begin{vmatrix} \BC & \BA \end{vmatrix} \Be_{12}.
\end{aligned}
\end{equation}
the intersection parameters are
\begin{equation}\label{eqn:triangle_area_problem:100}
\begin{aligned}
s_1 &= \frac{\BB \wedge \BC }{\BA \wedge \BC – \BA \wedge \BB } = \frac{\beta}{-\gamma – \alpha} \\
s_2 &= \frac{\BA \wedge \BB }{\BC \wedge \BB – \BC \wedge \BA } = \frac{\alpha}{-\beta – \gamma} \\
s_3 &= \frac{\BA \wedge \BC }{\BB \wedge \BC – \BB \wedge \BA } = \frac{-\gamma}{\beta + \alpha},
\end{aligned}
\end{equation}
so the intersection points are
\begin{equation}\label{eqn:triangle_area_problem:120}
\begin{aligned}
\BD &= -\BA \frac{\beta}{\gamma + \alpha} \\
\BE &= -\BC \frac{\alpha}{\beta + \gamma} \\
\BF &= -\BB \frac{\gamma}{\beta + \alpha}.
\end{aligned}
\end{equation}

We may now express the known areas in terms of these unknown vectors
\begin{equation}\label{eqn:triangle_area_problem:140}
\begin{aligned}
A_1 &= \inv{2} \Abs{ \BD \wedge \BC } \\
A_2 &= \inv{2} \Abs{ \lr{\BC – \BA} \wedge \lr{ \BD – \BA } } \\
A_3 &= \inv{2} \Abs{ \lr{\BA – \BC} \wedge \lr{ \BE – \BC } } \\
A_5 &= \inv{2} \Abs{ \lr{\BB – \BC} \wedge \lr{ \BF – \BC } },
\end{aligned}
\end{equation}
but
\begin{equation}\label{eqn:triangle_area_problem:160}
\begin{aligned}
\BD – \BA &= -\BA \lr{ 1 + \frac{\beta}{\gamma + \alpha} } \\
\BE – \BC &= -\BC \lr{ 1 + \frac{\alpha}{\beta + \gamma} } \\
\BF – \BC &= -\BB \frac{\gamma}{\beta + \alpha} – \BC,
\end{aligned}
\end{equation}
so
\begin{equation}\label{eqn:triangle_area_problem:180}
\begin{aligned}
A_1 &= \inv{2} \Abs{ \BA \wedge \BC \frac{\beta}{\gamma + \alpha} } = \inv{2} \Abs{ \gamma} \Abs{ \frac{\beta}{\gamma + \alpha} } \\
A_2 &= \inv{2} \Abs{ \lr{\BC – \BA} \wedge \BA } \Abs{ 1 + \frac{\beta}{\gamma + \alpha} } = \inv{2} \Abs{\gamma} \Abs{ 1 + \frac{\beta}{\gamma + \alpha} } \\
A_3 &= \inv{2} \Abs{ \lr{\BA – \BC} \wedge \BC } \Abs{ 1 + \frac{\alpha}{\beta + \gamma} } = \inv{2} \Abs{\gamma} \Abs{ 1 + \frac{\alpha}{\beta + \gamma} },
\end{aligned}
\end{equation}
and
\begin{equation}\label{eqn:triangle_area_problem:200}
\begin{aligned}
A_5
&= \inv{2} \Abs{ \lr{\BB – \BC} \wedge \lr{ \BB \frac{\gamma}{\beta + \alpha} + \BC } } \\
&= \inv{2} \Abs{ \BB \wedge \BC – \BC \wedge \BB \frac{\gamma}{\beta + \alpha} } \\
&= \inv{2} \Abs{ \beta } \Abs{ 1 + \frac{\gamma}{\beta + \alpha} }.
\end{aligned}
\end{equation}

This gives us four equations in two (bivector) unknowns
\begin{equation}\label{eqn:triangle_area_problem:220}
\begin{aligned}
4 A_1^2 \lr{ \gamma + \alpha }^2 &= -\gamma^2 \beta^2 \\
4 A_2^2 \lr{ \gamma + \alpha }^2 &= -\gamma^2 \lr{ \alpha + \beta + \gamma }^2 \\
4 A_3^2 \lr{ \gamma + \beta }^2 &= -\gamma^2 \lr{ \alpha + \beta + \gamma }^2 \\
4 A_4^2 \lr{ \alpha + \beta }^2 &= -\beta^2 \lr{ \alpha + \beta + \gamma }^2.
\end{aligned}
\end{equation}
Let’s recast this in terms of area determinants, to eliminate the bivector variables in these equations. To do so, write
\begin{equation}\label{eqn:triangle_area_problem:240}
\begin{aligned}
X &= \begin{vmatrix} \BA & \BB \end{vmatrix} \\
Y &= \begin{vmatrix} \BB & \BC \end{vmatrix} \\
Z &= \begin{vmatrix} \BC & \BA \end{vmatrix}.
\end{aligned}
\end{equation}
so
\begin{equation}\label{eqn:triangle_area_problem:300}
\begin{aligned}
4 A_1^2 \lr{ Z + X }^2 &= Z^2 Y^2 \\
4 A_2^2 \lr{ Z + X }^2 &= Z^2 \lr{ X + Y + Z }^2 \\
4 A_3^2 \lr{ Z + Y }^2 &= Z^2 \lr{ X + Y + Z }^2 \\
4 A_4^2 \lr{ X + Y }^2 &= Y^2 \lr{ X + Y + Z }^2.
\end{aligned}
\end{equation}
The goal is now to solve this system for \( X \). That solution (courtesy of Mathematica), for the numeric values in the original problem \( A_1 = 40, A_2 = 30, A_3 = 35, A_4 = 84 \), is:

\begin{equation}\label{eqn:triangle_area_problem:280}
\begin{aligned}
X &= \pm 630 \\
Y &= \mp 280 \\
Z &= \mp 140,
\end{aligned}
\end{equation}
so the total area is \( 315 \).

Now, I’ll have to watch the video and see how he solved it. I’d guess in a considerably simpler way.

Speaker stands for Sofia’s office.

February 7, 2024 Wood working , ,

Sofia took down the curtain tie downs on the window casings, which left a small hole in each.  She also had a pair of new speakers that have been taking space on her desk that she thought would go well in exactly those positions, and commissioned me to make her a couple speaker stands.  Looking at them in retrospect, they have a bit of a Star Trek enterprise look:

Each has a 5.5″ inset circular region, routed out about a 1/4″ deep.  I stacked 4 or 5 old CD (things like Windows 95, and NT4.0 install disks that I didn’t care about) and then used a router bushing to trace the outside circular profile with a small upcut bit.  Then, with a large plexiglass custom router base that I made (about 12″ x 12″) that didn’t sag into the hole I wanted to make, I then hogged out the interior using a big 1/2″ bit.  The exterior circular profile of one base was cut by hand with a jigsaw, and then sanded.  I then double stick taped a second rough cut piece, and used a router bit with a pair of tracing bushings on it, to cut a matching profile in a second piece of wood.  I used the table saw table saw router table extension I’d made:

to trace the profile of one piece onto the other.  Here’s a couple details of the joinery:

I notched slightly into the top so that I had a flat surface to join the wall flap to.  I’d used scrap (maple?) from an old dresser we disassembled last year, and it had a slight warp to it.  Routing out that 3/4″ groove (running it on my router table on some flat stock) gave a nice rectangular gluing surface.  I also used screws, inset into the top about a 1/4″ inch, to physically join the two pieces together.  I’m not sure the screws were required, since the glue joint seemed suprisingly strong, even without dove tails or other structural elements.  To finish things off, I hammered in a couple of really snug dowels, and flush cut them.  The dowel wood is clearly a different type, but I think the contrast looks really good.

 

Here’s the final configuration:

Unfortunately, neither Sofia nor I thought of measuring the wire that runs between the two speakers, and it’s not quite long enough.  The final part of the project will be cutting that wire and soldiering in an extension, so the wire can be tucked away under the desk.

Using chatgpt as online Mathematica help

January 26, 2024 Mathematica , , , ,

Here is a question that I probably would have posed at mathematica.stackexchange.com in the past, but this time I tried it using ChatGPT

“In Mathematica, I can sort by the last element in a list using something like:

SortBy[{{1, 2, 3}, {2, 3, 1}, {3, 1, 2}}, Last]

How do I specify two sort keys, for example, sort using Last as the primary key, and First as a secondary key?”

 

Turns out that the answer was in the Mathematica help too, right in the synopsis:


but I didn’t see it, since I’d gone straight to the examples, and didn’t see anything there.

ChatGPT should have a fun mode like Grok.  The obvious answer should have made fun of my sample query, cut and pasted from the Mathematica SortBy help, perhaps:

“Your example sucks, since sorting by the primary key is sufficient.  If you really want to waste computing cycles, this is how to do what you asked…”

My real Sort was:

filtered3 = SortBy[Select[raw3, ( (# // Last) > 0 ) &], {Last, First}];

to produce the following table of router bushing offsets + bit size:

The sort for that table did require a primary and secondary key, and initially didn’t have a nice ordering.

Bivector transformation, and reciprocal frame for column vectors of a transformation

January 21, 2024 math and physics play , , , ,

[Click here for a PDF version of this and previous two posts]

The author of a book draft I am reading pointed out if a vector transforms as
\begin{equation}\label{eqn:adjoint:760}
\Bv \rightarrow M \Bv,
\end{equation}
then cross products must transform as
\begin{equation}\label{eqn:adjoint:780}
\Ba \cross \Bb \rightarrow \lr{ \textrm{adj}\, M }^\T \lr{ \Ba \cross \Bb }.
\end{equation}
Bivectors clearly must transform in the same fashion. We also noticed that the adjoint is related to the reciprocal frame vectors of the columns of \( M \), but didn’t examine the reciprocal frame formulation of the adjoint in any detail.

Before we do that, let’s consider a slightly simpler case, the transformation of a pseudoscalar. That is
\begin{equation}\label{eqn:adjoint:800}
\begin{aligned}
M(\Ba) \wedge M(\Bb) \wedge M(\Bc)
&\rightarrow
\sum_{ijk}
\lr{ \Bm_i a_i } \wedge
\lr{ \Bm_j a_j } \wedge
\lr{ \Bm_k a_k } \\
&=
\sum_{ijk}
\lr{ \Bm_i \wedge \Bm_j \wedge \Bm_k } a_i b_j c_k \\
&=
\sum_{ijk}
\lr{ \Bm_1 \wedge \Bm_2 \wedge \Bm_3 } \epsilon_{ijk} a_i b_j c_k \\
&=
\Abs{M}
\sum_{ijk} \epsilon_{ijk} a_i b_j c_k \\
&=
\Abs{M} \lr{ \Ba \wedge \Bb \wedge \Bc }.
\end{aligned}
\end{equation}
This is a well known geometric algebra result (called an outermorphism transformation.)

It’s somewhat amusing that an outermorphism transformation with two wedged vectors is a bit more complicated to express than the same for three. Let’s see if we can find a coordinate free form for such a transformation.
\begin{equation}\label{eqn:adjoint:820}
\begin{aligned}
M(\Ba) \wedge M(\Bb)
&=
\sum_{ij} \lr{ \Bm_i a_i } \wedge \lr{ \Bm_j b_j } \\
&=
\sum_{ij} \lr{ \Bm_i \wedge \Bm_j } a_i b_j \\
&=
\sum_{i < j} \lr{ \Bm_i \wedge \Bm_j }
\begin{vmatrix}
a_i & a_j \\
b_i & b_j
\end{vmatrix} \\
&=
\sum_{i < j} \lr{ \Bm_i \wedge \Bm_j } \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_j \wedge \Be_i } }.
\end{aligned}
\end{equation}

Recall that the reciprocal frame with respect to the basis \( \setlr{ \Bm_1, \Bm_2, \Bm_3 } \), assuming this is a non-degenerate basis, has elements of the form
\begin{equation}\label{eqn:adjoint:840}
\begin{aligned}
\Bm^1 &= \lr{ \Bm_2 \wedge \Bm_3 } \inv{ \Bm_1 \wedge \Bm_2 \wedge \Bm_3 } \\
\Bm^2 &= \lr{ \Bm_3 \wedge \Bm_1 } \inv{ \Bm_1 \wedge \Bm_2 \wedge \Bm_3 } \\
\Bm^3 &= \lr{ \Bm_1 \wedge \Bm_2 } \inv{ \Bm_1 \wedge \Bm_2 \wedge \Bm_3 }.
\end{aligned}
\end{equation}
This can be flipped around as
\begin{equation}\label{eqn:adjoint:860}
\begin{aligned}
\Bm_2 \wedge \Bm_3 &= \Bm^1 \Abs{M} I \\
\Bm_3 \wedge \Bm_1 &= \Bm^2 \Abs{M} I \\
\Bm_1 \wedge \Bm_2 &= \Bm^3 \Abs{M} I \\
\end{aligned}
\end{equation}
\begin{equation}\label{eqn:adjoint:880}
\begin{aligned}
M&(\Ba) \wedge M(\Bb) \\
&=
\lr{ \Bm_1 \wedge \Bm_2 } \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_2 \wedge \Be_1 } }
+
\lr{ \Bm_2 \wedge \Bm_3 } \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_3 \wedge \Be_2 } }
+
\lr{ \Bm_3 \wedge \Bm_1 } \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_1 \wedge \Be_3 } } \\
&=
I \Abs{M} \lr{
\Bm^3 \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_2 \wedge \Be_1 } }
+
\Bm^1 \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_3 \wedge \Be_2 } }
+
\Bm^2 \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_1 \wedge \Be_3 } }
}
\end{aligned}
\end{equation}

Let’s see if we can simplify one of these double index quantities
\begin{equation}\label{eqn:adjoint:900}
\begin{aligned}
I \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_2 \wedge \Be_1 } }
&=
\gpgradethree{ I \lr{ \lr{ \Ba \wedge \Bb } \cdot \lr{ \Be_2 \wedge \Be_1 } } } \\
&=
\gpgradethree{ I \lr{ \Ba \wedge \Bb } \lr{ \Be_2 \wedge \Be_1 } } \\
&=
\gpgradethree{ \lr{ \Ba \wedge \Bb } \Be_{12321} } \\
&=
\gpgradethree{ \lr{ \Ba \wedge \Bb } \Be_{3} } \\
&=
\Ba \wedge \Bb \wedge \Be_3.
\end{aligned}
\end{equation}
We have
\begin{equation}\label{eqn:adjoint:920}
M(\Ba) \wedge M(\Bb) = \Abs{M} \lr{
\lr{ \Ba \wedge \Bb \wedge \Be_1 } \Bm^1
+
\lr{ \Ba \wedge \Bb \wedge \Be_2 } \Bm^2
+
\lr{ \Ba \wedge \Bb \wedge \Be_3 } \Bm^3
}.
\end{equation}

Using summation convention, we can now express the transformation of a bivector \( B \) as just
\begin{equation}\label{eqn:adjoint:940}
B \rightarrow \Abs{M} \lr{ B \wedge \Be_i } \Bm^i.
\end{equation}
If we are interested in the transformation of a pseudovector \( \Bv \) defined implicitly as the dual of a bivector \( B = I \Bv \), where
\begin{equation}\label{eqn:adjoint:960}
B \wedge \Be_i = \gpgradethree{ I \Bv \Be_i } = I \lr{ \Bv \cdot \Be_i }.
\end{equation}
This leaves us with a transformation rule for cross products equivalent to the adjoint relation \ref{eqn:adjoint:780}
\begin{equation}\label{eqn:adjoint:980}
\lr{ \Ba \cross \Bb } \rightarrow \lr{ \Ba \cross \Bb } \cdot \Be_i \Abs{M} \Bm^i.
\end{equation}
As intuited, the determinant weighted reciprocal frame vectors for the columns of the transformation \( M \), are the components of the adjoint. That is
\begin{equation}\label{eqn:adjoint:1000}
\lr{ \textrm{adj}\, M }^\T = \Abs{M}
\begin{bmatrix}
\Bm^1 & \Bm^2 & \Bm^3
\end{bmatrix}.
\end{equation}

Simplifying the previous adjoint matrix results.

January 17, 2024 math and physics play , , , , , , , , ,

[Click here for a PDF version of this (and the previous) post]

We previously found determinant expressions for the matrix elements of the adjoint for 2D and 3D matrices \( M \). However, we can extract additional structure from each of those results.

2D case.

Given a matrix expressed in block matrix form in terms of it’s columns
\begin{equation}\label{eqn:adjoint:500}
M =
\begin{bmatrix}
\Bm_1 & \Bm_2
\end{bmatrix},
\end{equation}
we found that the adjoint \( A \) satisfying \( M A = \Abs{M} I \) had the structure
\begin{equation}\label{eqn:adjoint:520}
A =
\begin{bmatrix}
\begin{vmatrix} \Be_1 & \Bm_2 \end{vmatrix} & \begin{vmatrix} \Be_2 & \Bm_2 \end{vmatrix} \\
& \\
\begin{vmatrix} \Bm_1 & \Be_1 \end{vmatrix} & \begin{vmatrix} \Bm_1 & \Be_2 \end{vmatrix}
\end{bmatrix}.
\end{equation}
We initially had wedge product expressions for each of these matrix elements, and can discover our structure by putting back those wedge products. Modulo sign, each of these matrix elemens has the form
\begin{equation}\label{eqn:adjoint:540}
\begin{aligned}
\begin{vmatrix} \Be_i & \Bm_j \end{vmatrix}
&=
\lr{ \Be_i \wedge \Bm_j } i^{-1} \\
&=
\gpgradezero{
\lr{ \Be_i \wedge \Bm_j } i^{-1}
} \\
&=
\gpgradezero{
\lr{ \Be_i \Bm_j – \Be_i \cdot \Bm_j } i^{-1}
} \\
&=
\gpgradezero{
\Be_i \Bm_j i^{-1}
} \\
&=
\Be_i \cdot \lr{ \Bm_j i^{-1} },
\end{aligned}
\end{equation}
where \( i = \Be_{12} \). The adjoint matrix is
\begin{equation}\label{eqn:adjoint:560}
A =
\begin{bmatrix}
-\lr{ \Bm_2 i } \cdot \Be_1 & -\lr{ \Bm_2 i } \cdot \Be_2 \\
\lr{ \Bm_1 i } \cdot \Be_1 & \lr{ \Bm_1 i } \cdot \Be_2 \\
\end{bmatrix}.
\end{equation}
If we use a column vector representation of the vectors \( \Bm_j i^{-1} \), we can write the adjoint in a compact hybrid geometric-algebra matrix form
\begin{equation}\label{eqn:adjoint:640}
A =
\begin{bmatrix}
-\lr{ \Bm_2 i }^\T \\
\lr{ \Bm_1 i }^\T
\end{bmatrix}.
\end{equation}

Check:

Let’s see if this works, by multiplying with \( M \)
\begin{equation}\label{eqn:adjoint:580}
\begin{aligned}
A M &=
\begin{bmatrix}
-\lr{ \Bm_2 i }^\T \\
\lr{ \Bm_1 i }^\T
\end{bmatrix}
\begin{bmatrix}
\Bm_1 & \Bm_2
\end{bmatrix} \\
&=
\begin{bmatrix}
-\lr{ \Bm_2 i }^\T \Bm_1 & -\lr{ \Bm_2 i }^\T \Bm_2 \\
\lr{ \Bm_1 i }^\T \Bm_1 & \lr{ \Bm_1 i }^\T \Bm_2
\end{bmatrix}.
\end{aligned}
\end{equation}
Those dot products have the form
\begin{equation}\label{eqn:adjoint:600}
\begin{aligned}
\lr{ \Bm_j i }^\T \Bm_i
&=
\lr{ \Bm_j i } \cdot \Bm_i \\
&=
\gpgradezero{ \lr{ \Bm_j i } \Bm_i } \\
&=
\gpgradezero{ -i \Bm_j \Bm_i } \\
&=
-i \lr{ \Bm_j \wedge \Bm_i },
\end{aligned}
\end{equation}
so
\begin{equation}\label{eqn:adjoint:620}
\begin{aligned}
A M &=
\begin{bmatrix}
i \lr{ \Bm_2 \wedge \Bm_1 } & 0 \\
0 & -i \lr { \Bm_1 \wedge \Bm_2 }
\end{bmatrix} \\
&=
\Abs{M} I.
\end{aligned}
\end{equation}
We find the determinant weighted identity that we expected. Our methods are a bit schizophrenic, switching fluidly between matrix and geometric algebra representations, but provided we are careful enough, this isn’t problematic.

3D case.

Now, let’s look at the 3D case, where we assume a column vector representation of the matrix of interest
\begin{equation}\label{eqn:adjoint:660}
M =
\begin{bmatrix}
\Bm_1 & \Bm_2 & \Bm_3
\end{bmatrix},
\end{equation}
and try to simplify the expression we found for the adjoint
\begin{equation}\label{eqn:adjoint:680}
A =
\begin{bmatrix}
\begin{vmatrix} \Be_1 & \Bm_2 & \Bm_3 \end{vmatrix} & \begin{vmatrix} \Be_2 & \Bm_2 & \Bm_3 \end{vmatrix} & \begin{vmatrix} \Be_3 & \Bm_2 & \Bm_3 \end{vmatrix} \\
& & \\
\begin{vmatrix} \Be_1 & \Bm_3 & \Bm_1 \end{vmatrix} & \begin{vmatrix} \Be_2 & \Bm_3 & \Bm_1 \end{vmatrix} & \begin{vmatrix} \Be_3 & \Bm_3 & \Bm_1 \end{vmatrix} \\
& & \\
\begin{vmatrix} \Be_1 & \Bm_1 & \Bm_2 \end{vmatrix} & \begin{vmatrix} \Be_2 & \Bm_1 & \Bm_2 \end{vmatrix} & \begin{vmatrix} \Be_3 & \Bm_1 & \Bm_2 \end{vmatrix}
\end{bmatrix}.
\end{equation}
As with the 2D case, let’s re-express these determinants in wedge product form. We’ll write \( I = \Be_{123} \), and find
\begin{equation}\label{eqn:adjoint:700}
\begin{aligned}
\begin{vmatrix} \Be_i & \Bm_j & \Bm_k \end{vmatrix}
&=
\lr{ \Be_i \wedge \Bm_j \wedge \Bm_k } I^{-1} \\
&=
\gpgradezero{ \lr{ \Be_i \wedge \Bm_j \wedge \Bm_k } I^{-1} } \\
&=
\gpgradezero{ \lr{
\Be_i \lr{ \Bm_j \wedge \Bm_k }
\Be_i \cdot \lr{ \Bm_j \wedge \Bm_k }
} I^{-1} } \\
&=
\gpgradezero{
\Be_i \lr{ \Bm_j \wedge \Bm_k }
I^{-1} } \\
&=
\gpgradezero{
\Be_i \lr{ \Bm_j \cross \Bm_k } I
I^{-1} } \\
&=
\Be_i \cdot \lr{ \Bm_j \cross \Bm_k }.
\end{aligned}
\end{equation}
We see that we can put the adjoint in block matrix form
\begin{equation}\label{eqn:adjoint:720}
A =
\begin{bmatrix}
\lr{ \Bm_2 \cross \Bm_3 }^\T \\
\lr{ \Bm_3 \cross \Bm_1 }^\T \\
\lr{ \Bm_1 \cross \Bm_2 }^\T \\
\end{bmatrix}.
\end{equation}

Check:

\begin{equation}\label{eqn:adjoint:740}
\begin{aligned}
A M
&=
\begin{bmatrix}
\lr{ \Bm_2 \cross \Bm_3 }^\T \\
\lr{ \Bm_3 \cross \Bm_1 }^\T \\
\lr{ \Bm_1 \cross \Bm_2 }^\T \\
\end{bmatrix}
\begin{bmatrix}
\Bm_1 & \Bm_2 & \Bm_3
\end{bmatrix} \\
&=
\begin{bmatrix}
\lr{ \Bm_2 \cross \Bm_3 }^\T \Bm_1 & \lr{ \Bm_2 \cross \Bm_3 }^\T \Bm_2 & \lr{ \Bm_2 \cross \Bm_3 }^\T \Bm_3 \\
\lr{ \Bm_3 \cross \Bm_1 }^\T \Bm_1 & \lr{ \Bm_3 \cross \Bm_1 }^\T \Bm_2 & \lr{ \Bm_3 \cross \Bm_1 }^\T \Bm_3 \\
\lr{ \Bm_1 \cross \Bm_2 }^\T \Bm_1 & \lr{ \Bm_1 \cross \Bm_2 }^\T \Bm_2 & \lr{ \Bm_1 \cross \Bm_2 }^\T \Bm_3
\end{bmatrix} \\
&=
\Abs{M} I.
\end{aligned}
\end{equation}

Essentially, we found that the rows of the adjoint matrix are each parallel to the reciprocal frame vectors of the columns of \( M \). This makes sense, as the reciprocal frame encodes a generalized inverse of sorts.