约旦分解


18

重要说明:因为此挑战仅适用于平方矩阵,所以每当我使用术语“矩阵”时,都假设我是指平方矩阵。为了简洁起见,我将省略“方形”描述。

背景

通过使用相似的对角矩阵(一个不在主对角线上的元素为0的元素),可以简化许多与矩阵相关的操作,例如计算行列式,求解线性系统或将标量值函数扩展到矩阵。到原始矩阵(意味着,对于输入矩阵A和对角线矩阵D,存在一些可逆矩阵P,使得D = P^(-1) * A * P;另外,DA共享一些重要性质,如本征值,决定因素,而迹线)。对于具有不同特征值的矩阵(矩阵的特征多项式的根,通过求解det(A-λI) = 0给出λ,其中I是与相同维的恒等式A),对角化很简单:D是一个矩阵,其特征值在主对角线上,并且P是一个由对应于这些特征值的特征向量组成的矩阵(顺序相同)。这个过程称为本征分解

但是,具有重复特征值的矩阵不能以这种方式对角线化。幸运的是,任何矩阵的约旦范式都可以很容易地计算出来,并且比常规的对角矩阵难得多。它还具有很好的特性,如果特征值是唯一的,则Jordan分解与特征分解相同。

约旦分解解释

对于A特征值均具有1的几何多重性的方阵,约旦分解的过程可描述如下:

  1. λ = {λ_1, λ_2, ... λ_n}A具有多重性的特征值列表,其中重复的特征值连续出现。
  2. 创建一个对角矩阵,J其元素是的元素λ,顺序相同。
  3. 对于每个多重性大于1 1的特征值,将特征值的每个重复项的右边放在a 的主对角线上J,最后一个除外。

所得矩阵J是的约旦范式A(对于给定矩阵,可以有多个约旦范式,具体取决于特征值的顺序)。

一个可行的例子

A以下矩阵:

矩阵

A具有多重性的特征值是λ = {1, 2, 4, 4}。通过将它们放入对角矩阵,我们得到以下结果:

第2步

接下来,将1s 放在每个重复特征值中的一个之外的所有右边。由于4是唯一重复的特征值,因此我们1在前四个值旁边放置一个:

约旦形式

这是Jordan的正常形式A(单个矩阵可能具有几种有效的Jordan正常形式,但是出于解释的目的,我将详细介绍该细节)。

任务

给定方阵A作为输入,输出有效的Jordan范式A

  • 输入和输出可以采用任何合理的格式(2D数组/列表/任何形式,列表/阵列/任何列或行向量,内置矩阵数据类型等)。
  • 的元素和特征值A将始终是范围内的整数[-200, 200]
  • 为了简单起见,所有的特征值将具有1的几何多重性(因此上述过程成立)。
  • A 最多为10x10矩阵,至少为2x2矩阵。
  • 不允许使用计算特征值和/或特征向量或执行特征分解,Jordan分解或任何其他类型的分解/对角化的内建函数。允许矩阵算术,矩阵求逆和其他矩阵内置函数。

测试用例

[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]

Answers:


4

数学,140个 139 105字节

Total[DiagonalMatrix@@@{{#},{1-Sign[Differences@#^2],1}}]&@(x/.Solve[#~CharacteristicPolynomial~x==0,x])&

我刚刚找到了内置的内建DiagonalMatrix函数,该内建函数可以轻松地沿超对角线放置0和1。

用法

例


Last@JordanDecomposition@#&呢 还是作弊?
Ruslan

@Ruslan是的,规则之一是不允许执行约旦分解的内置函数。不过谢谢
英里

2

贤者,79字节

lambda A:block_diagonal_matrix([jordan_block(*r)for r in A.charpoly().roots()])

在线尝试

由于没有其他人发布解决方案,所以我不妨继续发布一个。

A.charpoly.roots()计算的特征多项式A(即特征值和多重性)的根(和代数多重性)。jordan_block从给定的根和多重性构造一个Jordan块。block_diagonal_matrix形成一个矩阵,在对角线上有约旦块,这恰好是约旦法线形式的定义。


2

J78 71字节

1(#\.|."_1#{."1],.2=/\,&_)@>@{[:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\

在线尝试!

该任务的两个具有挑战性的部分是获取特征值并执行对角线化,最终都占用相同数量的字节。这些是规则所不允许的,但是如果有任何好奇的话,J内置了QR分解(128!:0)以及可用于查找特征值的LAPACK插件的内建函数。

说明(过时)

该动词有两个主要部分:找到特征值和执行对角线化。首先,为了找到特征值,必须找到输入矩阵的特征多项式的根。使用示例中的相同输入矩阵,

   ] m =: _4 ]\ 5 4 2 1 0 1 _1 _1 _1 _1 3 0 1  1 _1 2
 5  4  2  1
 0  1 _1 _1
_1 _1  3  0
 1  1 _1  2

矩阵M的特征多项式可以使用| M - λI | = 0,其中I是与M相同维的单位矩阵。可以在J中对M - λI表达式进行建模,方法是将M中的每个元素放在对角线上,如果它们在对角线上则用-1填充,否则用0填充。每个框代表系数形式的多项式。

   (],&.>[:-@=#\) m
┌────┬────┬────┬────┐
│5 _1│4 0 │2 0 │1 0 │
├────┼────┼────┼────┤
│0 0 │1 _1│_1 0│_1 0│
├────┼────┼────┼────┤
│_1 0│_1 0│3 _1│0 0 │
├────┼────┼────┼────┤
│1 0 │1 0 │_1 0│2 _1│
└────┴────┴────┴────┘

-/ .*但是,J中的行列式是对数字而不是盒装多项式进行运算的。除了多项式,还需要多项式积,可以使用卷积([:+//.*/)找到。仍然使用折叠减法,并且这两个动词都需要在方框内操作,因此使用(&.)下的unbox(>)。

   ([:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌───────────────┐
│32 _64 42 _11 1│
└───────────────┘

这些是特征多项式的系数。可以找到根,使用根可以p.在系数和根形式之间转换多项式的表示形式。

   ([:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌─┬───────┐
│1│4 4 2 1│
└─┴───────┘

M的根是[4, 4, 2, 1]和。

其次,必须执行对角线化。每个连续的值对都进行相等性测试。

   (2=/\]) 4 4 2 1
1 0 0

附加一个零,然后将这些值与特征值一起累加。

   (],.0,~2=/\]) 4 4 2 1
4 1
4 0
2 0
1 0

然后,将每一行填充到与特征值数量相同的长度,以形成方矩阵。

   (#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
4 0 0 0
2 0 0 0
1 0 0 0

最后,每行向右移动,值在右侧下降,而零在左侧被推入。第一行移位了零次,第二行移位了,第三行移位了两次,依此类推。

   (-@i.@#|.!.0"_1#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
0 4 0 0
0 0 2 0
0 0 0 1

输出是M的约旦分解。



1

MATL,29字节,无竞争

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

在线尝试!

这是我第一次提交MATL,因此肯定会有改进。我花了一段时间学习它,直到最后我才记得从2016年5月7日起使用MATL可能无法正常工作。果然,我签出了当天的倒数第二次提交,但它没有运行。

我本来想使用,diag但MATL似乎仅支持单参数版本。需要第二个参数来沿超对角线(或针对其他问题的任何其他对角线)放置值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.