辅助因子矩阵


18

辅因子矩阵是Adjugate矩阵的转置。该矩阵的元素是原始矩阵的辅因子

辅因子在此处输入图片说明(即第i行和第j列的辅因子矩阵的元素)是通过从原始矩阵中删除第i列和第j列乘以(-1)^(i + j)形成的子矩阵的行列式。

例如,对于矩阵

在此处输入图片说明

第1行和第2列的辅助因子矩阵的元素为:

在此处输入图片说明

您可以在此处找到有关矩阵行列式是什么以及如何计算它们的信息

挑战

您的目标是输出输入矩阵的辅因子矩阵。

注意允许使用用于评估辅因子矩阵,辅助矩阵,行列式或类似物的内置函数。

输入值

可以以STDIN最适合您使用的语言的方式或以任何方式将矩阵作为命令行参数,函数参数输入。

矩阵将被格式化为列表列表,每个子列表对应于一行,其中包含从左到右排序的因子。行在列表中从上到下排序。

例如矩阵

a b
c d

将以表示[[a,b],[c,d]]

如果适合您的语言并且明智(例如((a;b);(c;d))),则可以用其他方式替换方括号和逗号。

矩阵将仅包含整数(可以为负数)

矩阵将始终为正方形(即行和列的数量相同)。

您可以假设输入将始终是正确的(即,没有格式问题,除整数外没有其他问题,没有空矩阵)。

输出量

所得的辅助因子矩阵可以输出到 STDOUT函数,从函数返回,写入文件或任何自然适合您使用的语言的东西。

辅助因子矩阵的格式必须与输入矩阵的给出完全相同,例如[[d,-c],[-b,a]]。如果读取字符串,则必须返回/输出一个字符串,在该字符串中,矩阵的格式应与输入中的格式完全相同。如果您使用诸如列表列表之类的内容作为输入,那么您也必须返回列表列表。

测试用例

  • 输入: [[1]]

输出: [[1]]

  • 输入: [[1,2],[3,4]]

输出: [[4,-3],[-2,1]]

  • 输入: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

输出: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • 输入: [[3,-2,7,5,0],[1,-1,42,12,-10],[7,7,7,7,7],[1,2,3,4,5],[-3,14,-1,5,-9]]

输出:

[[9044,-13580,-9709,23982,-9737],[-1981,1330,3689,-3444,406],[14727,7113,2715,-9792,414],[-28448,-2674,-707,16989,14840],[-2149,2569,-2380,5649,-3689]]

计分

这是因此最短的答案以字节为单位。


2
我不确定如何解释辅因子矩阵的格式是否必须与从参数中获取输入并返回值的函数提交的输入矩阵完全相同。我们是否读取/返回实际矩阵或其字符串表示形式?
丹尼斯

1
简而言之:如果您读取一个字符串,那么您必须返回/输出一个字符串,该字符串的格式与输入中的格式完全相同。如果您使用诸如列表列表之类的东西,那么您也必须返回列表列表。
致命

1x1矩阵真的有辅因子矩阵吗?
利亚姆

同样,您的倒数第二个测试用例似乎是辅助矩阵(应该是应该转换的矩阵),除非我弄错了。
利亚姆(Liam)2015年

@ICanHazHats正确,我修复了,谢谢。
致命

Answers:


1

J,29个字节

3 :'<.0.5+|:(-/ .**%.)1e_9+y'

相同的epsilon /逆/行列式技巧。从右到左:

  • 1e_9+ 添加一个ε,
  • (-/ .**%.)行列式-/ .*)乘逆数%.),
  • |: 转置
  • <.0.5+ 回合。

5

Matlab,42 33字节

使用匿名函数:

@(A)round(inv(A+eps)'*det(A+eps))

输入和输出是矩阵(二维数字数组)。

eps如果矩阵是奇异的,则添加。使用“删除” round(保证真实结果为整数)。

例:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)'*det(A+eps))
>> ans([-3,2,-5; -1,0,-2; 3,-4,1])
ans =
-8    -5     4
18    12    -6
-4    -1     2

奇异矩阵示例:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)*det(A+eps)')
>> ans([1,0 ; 0,0])
ans =
     0     0
     0     1

或者在Octave中在线尝试


2
但是,我确实有一个我在挑战中没有谈到的担忧:这个答案假设输入矩阵是可逆的。使用您的代码说出[1,0 ; 0,0]应该输出的错误[0,0 ; 0,1]
Fatalize 2015年

1
由于您是从函数返回的,所以我认为您不需要mat2str:“结果辅助因子矩阵可能是...从函数返回的”
FryAmTheEggman 2015年

1
@FryAmTheEggman谢谢!但是“ 必须以与给定输入矩阵完全相同的方式格式化辅助因子矩阵 ”。这就是为什么我认为我需要mat2str
Luis Mendo

1
@Fatalize是的,就是这样。eps大约是1e-16。因此,它使矩阵非奇异(但条件极差)。结果不完全是整数。因此fix(朝零舍入)可以解决该问题。如果错误未超过,则此方法有效.5。恐怕没有保证。对于非常大的整数,它可能会失败。我说这是一个肮脏的把戏:-P
路易斯·门多

1
@Fatalize为清楚起见,您能否mat2str在这里说是否需要?在我看来,由于这是一个函数,因此输入实际上是未格式化的矩阵。就像您尝试f=...执行f(f(...))此操作一样,此操作将不起作用,但是将其删除mat2str可以使其正常工作。
FryAmTheEggman 2015年


3

R,121 94字节

function(A)t(outer(1:(n=NROW(A)),1:n,Vectorize(function(i,j)(-1)^(i+j)*det(A[-i,-j,drop=F]))))

这是一个荒谬的长函数,它接受类的对象matrix并返回另一个这样的对象。要调用它,请将其分配给变量。

取消高尔夫:

cofactor <- function(A) {
    # Get the number of rows (and columns, since A is guaranteed to
    # be square) of the input matrix A
    n <- NROW(A)

    # Define a function that accepts two indices i,j and returns the
    # i,j cofactor
    C <- function(i, j) {
        # Since R loves to drop things into lower dimensions whenever
        # possible, ensure that the minor obtained by column deletion
        # is still a matrix object by adding the drop = FALSE option
        a <- A[-i, -j, drop = FALSE]

        (-1)^(i+j) * det(a)
    }

    # Obtain the adjugate matrix by vectorizing the function C over
    # the indices of A
    adj <- outer(1:n, 1:n, Vectorize(C))

    # Transpose to obtain the cofactor matrix
    t(adj)
}

80字节使用mapply代替outerVectorize
Giuseppe

2

GAP,246个字节

通过三层嵌套的for循环,您可以看出这是一种很好的编码。

这很简单。与其他面向数学的语言相比,GAP确实没有与矩阵相同的工具。这里真正使用的唯一东西是内置的行列式运算符。

f:=function(M)local A,B,i,j,v;A:=StructuralCopy(M);if not Size(M)=1 then for i in [1..Size(M)] do for j in [1..Size(M)] do B:=StructuralCopy(M);for v in B do Remove(v,j);od;Remove(B,i);A[i][j]:= (-1)^(i+j)*DeterminantMat(B);od;od;fi;Print(A);end;

松散

f:=function(M)
    local A,B,i,j,v;
    A:=StructuralCopy(M);
    if not Size(M)=1 then
        for i in [1..Size(M)] do
            for j in [1..Size(M)] do
                B:=StructuralCopy(M);
                for v in B do
                    Remove(v,j);
                od;
                Remove(B,i);
                 A[i][j]:= (-1)^(i+j)*DeterminantMat(B);
            od;
        od;
    fi;
    Print(A);
end;

1

详细度v2,196字节

IncludeTypePackage<Matrix>
IncludeTypePackage<OutputSystem>
print=OutputSystem:NewOutput<DEFAULT>
input=Matrix:Adjugate<ARGV0>
input=Matrix:Transpose<input>
OutputSystem:DisplayAsText<print;input>

在线尝试!

注意:暂时不支持TIO。应该脱机工作

以表格形式输入((a b)(c d))以表示

[一种bCd]

尽管具有辅助功能的内置功能,但是Verbosity的冗长性仍然使它变得残废。相当基本的工作方式,只是转置输入的辅助词。

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.