求矩阵幂


9

问题

创建一个程序或函数,该程序或函数可以计算加到n 次方的矩阵的结果。您的代码将采用一个任意的方矩阵A和一个非负整数n,并返回一个值为A n的矩阵。

限制条件

不允许使用用于计算矩阵幂和矩阵乘积的内置函数。

适用于代码高尔夫球的其余标准规则。

说明

给定一个方阵AA n的值= AA⋯AA与自身的重复矩阵乘积,n倍)。如果n为正,则使用刚才提到的标准。当n为零时,将得出具有相同A阶的单位矩阵。

目标

这是代码高尔夫球,最短的代码获胜。

测试用例

在这里,A是输入矩阵,n是输入整数,r是输出矩阵,其中r = A n

n = 0
A = 62 72
    10 34
r =  1  0
     0  1

n = 1
A = 23 61 47
    81 11 60
    42  9  0
r = 23 61 47
    81 11 60
    42  9  0

n = 2
A =  12  28 -26  3
     -3 -10 -13  0
     25  41   3 -4
    -20 -14  -4 29
r = -650 -1052  -766 227
    -331  -517   169  43
     332   469 -1158 -53
    -878  -990   574 797

n = 4
A = -42 -19  18 -38
    -33  26 -13  31
    -43  25 -48  28
     34 -26  19 -48
r = -14606833  3168904 -6745178  4491946
      1559282  3713073 -4130758  7251116
      8097114  5970846 -5242241 12543582
     -5844034 -4491274  4274336 -9196467

n = 5
A =  7  0 -3  8 -5  6 -6
     6  7  1  2  6 -3  2
     7  8  0  0 -8  5  2
     3  0  1  2  4 -3  4
     2  4 -1 -7 -4 -1 -8
    -3  8 -9 -2  7 -4 -8
    -4 -5 -1  0  5  5 -1
r =  39557  24398 -75256 131769  50575   14153  -7324
    182127  19109   3586 115176 -23305    9493 -44754
    146840  31906 -23476 190418 -38946   65494  26468
     42010 -21876  41060 -13950 -55148   19290   -406
     44130  34244 -35944  34272  22917  -39987 -54864
      1111  40810 -92324  35831 215711 -117849 -75038
    -70219   8803 -61496   6116  45247   50166   2109

3
矩阵乘积或矩阵求逆的内置函数呢?
丹尼斯

@Dennis我也在考虑禁止使用这些功能,但感觉太过严格了。
英里

2
对于没有内置矩阵求逆的语言,这给我带来变色龙挑战,因为从头开始求逆矩阵比采用迭代乘积要困难得多。
xnor

2
我同意@xnor。而如果一种语言没有矩阵求逆而是具有矩阵幂呢?可以A^-1代替inv(A)吗?
路易斯·门多

1
exp(k*log(M))允许吗?(尽管由于分支不唯一而可能无法正常工作。)
xnor

Answers:


4

果冻17 16 15 字节

Z×'³S€€
LṬ€z0Ç¡

在线尝试!

网格输出的固定链接:测试用例1 | 测试用例2 | 测试用例3 | 测试用例4 | 测试案例5

怎么运行的

LṬ€z0Ç¡  Main link. Arguments: A (matrix), n (power)

L        Get the length l of A.
 Ṭ€      Turn each k in [1, ..., l] into a Boolean list [0, 0, ..., 1] of length k.
   z0    Zip; transpose the resulting 2D list, padding with 0 for rectangularity.
         This constructs the identity matrix of dimensions k×k.
     Ç¡  Execute the helper link n times.

Z×'³S€€  Helper link. Argument: B (matrix)

Z        Zip; transpose rows and columns of B.
   ³     Yield A.
 ×'      Spawned multiplication; element-wise mutiply each rows of zipped B (i.e.,
         each column of B) with each row of A.
         This is "backwards", but multiplication of powers of A is commutative.
    S€€  Compute the sum of each product of rows.

5

MATL,20字节

XJZyXyi:"!J2$1!*s1$e

在线尝试!

说明

这可以通过手动进行矩阵乘法来避免矩阵乘法,方法是先进行元素乘法,然后进行广播,然后进行矢量化和。具体来说,要将矩阵MN都乘以大小s × s

  1. 转置M。调用结果矩阵P
  2. N例如,N将s的尺寸用旋转轴沿第一个尺寸“旋转”,得到s ×1× s 3D数组Q
  3. 相乘的每个元素P倍的每个元素Q,以隐式广播。这意味着它P会在第三个维度上自动复制s次,并在第二个维度Q上复制s次,以使它们均为s × s × s,然后再进行实际的逐元素乘法。
  4. 沿第一维求和以产生1× s × s数组。
  5. 挤压前导单调维,以产生s × s结果。

注释代码:

XJ      % take matrix A. Copy to clipboard J
ZyXy    % generate identity matrix of the same size
i:      % take exponent n. Generate range [1 2 ... n] (possibly empty)
"       % for each element in that range
  !     %   transpose matrix with product accumulated up to now (this is step 1)
  J     %   paste A
  2$1!  %   permute dimensions: rotation along first-dimension axis (step 2)
  *     %   element-wise multiplication with broadcast (step 3)
  s     %   sum along first dimension (step 4)
  1$e   %   squeeze out singleton dimension, i.e. first dimension (step 5)
        % end for. Display

失败为0 ....
CalculatorFeline

@CatsAreFluffy谢谢!已更正
Luis Mendo

3

APL,32 31个字符

{⍺=0:(⍴⍵)⍴1⍨1+≢⍵⋄+.×⍨⍣(⍺-1)⊣⍵}

左参数提高矩阵的能力,右参数矩阵。对于所需指数为0的情况,最困难(最占用空间的)位是在建立恒等矩阵。实际计算基于以下事实:.具有+×作为操作数的广义内积()实际上是矩阵积。这与电源操作员(“重复”)相结合,形成了解决方案。


1:您是在2016年游戏中以1个字节击败Dan&Nick的Stefano吗?2. (1+≢⍵)↑1=> 1↑⍨1+≢⍵保存一个字节。
扎卡里

是的,这就是我。
lstefano

2

贤者,112字节

lambda A,n:reduce(lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A],[A]*n,identity_matrix(len(A)))

在线尝试

说明:

内部lambda(lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A])是矩阵乘法的直接实现。外部lambda(lambda A,n:reduce(...,[A]*n,identity_matrix(len(A))))用于reduce通过迭代矩阵乘法(使用上述自制矩阵乘法函数)以恒等矩阵作为初始值来计算矩阵幂n=0


2

朱莉娅90 86 68字节

f(A,n)=n<1?eye(A):[A[i,:][:]⋅f(A,n-1)[:,j]for i=m=1:size(A,1),j=m]

这是一个递归函数,它接受一个矩阵(Array{Int,2})和一个整数并返回一个矩阵。

取消高尔夫:

function f(A, n)
    if n < 1
        # Identity matrix with the same type and dimensions as the input
        eye(A)
    else
        # Compute the dot product of the ith row of A and the jth column
        # of f called on A with n decremented
        [dot(A[i,:][:], f(A, n-1)[:,j]) for i = (m = 1:size(A,1)), j = m]
    end
end

在线尝试!(包括除最后一个测试用例以外的所有内容,这对于站点来说太慢了)

感谢Dennis,节省了18个字节!


2

Python 2.7版,158个 145字节

这里最差的答案,但我迄今为止最擅长使用Python。至少学习如何进行矩阵乘法很有趣。

打高尔夫球:

def q(m,p):
 r=range(len(m))
 if p<1:return[[x==y for x in r]for y in r]
 o=q(m,p-1)
 return[[sum([m[c][y]*o[x][c]for c in r])for y in r]for x in r]

说明:

#accepts 2 arguments, matrix, and power to raise to
def power(matrix,exponent):
 #get the range object beforehand
 length=range(len(matrix))
 #if we are at 0, return the identity
 if exponent<1:
  #the Boolean statement works because Python supports multiplying ints by bools
  return [[x==y for x in length] for y in length]
 #otherwise, recur
 lower=power(matrix,exponent-1)
 #and return the product
 return [[sum([matrix[c][y]*lower[x][c] for c in length]) for y in length] for x in length]

1

JavaScript(ES6),123字节

(n,a)=>[...Array(n)].map(_=>r=m(i=>m(j=>m(k=>s+=a[i][k]*r[k][j],s=0)&&s)),m=g=>a.map((_,n)=>g(n)),r=m(i=>m(j=>+!(i^j))))&&r

我使用的是132个字节的版本,reduce但由于映射的a频率太高,以至于为我编写一个辅助函数时,它要短9个字节。通过创建身份矩阵并将其乘以a长时间进行工作n。有许多表现形式是回报01i == j,但他们似乎都为7个字节。


1

Python 3,147字节

def f(a,n):
 r=range(len(a));r=[[i==j for j in r]for i in r]
 for i in range(n):r=[[sum(map(int.__mul__,x,y))for y in zip(*a)]for x in r]
 return r

在线尝试!


1

R,49个字节

f=function(m,n)`if`(n,m%*%f(m,n-1),diag(nrow(m)))

带有matrix的递归函数以及将n其提高到的幂。递归调用%*%,它计算点积。递归的初始值为与大小相同的单位矩阵m。既然如此m %*% m = m %*% m %*% I,那么就可以了。


0

Python 2,131字节

f=lambda M,n:n and[[sum(map(int.__mul__,r,c))for c in zip(*f(M,n-1))]for r in M]or[[0]*i+[1]+[0]*(len(M)+~i)for i in range(len(M))]

在线尝试!

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.