提高矩阵的权力

时间:2015-09-16 05:28:50

标签: r if-statement matrix linear-algebra

我试图创建一个函数,一旦它被提升到一个幂,就会给我一个矩阵的值。这是我到目前为止所做的:

A <- matrix(c(1,2,3,4,0,1,2,3,0,0,1,2,0,0,0,1),nrow=4,ncol=4)

power <- function(A,n){
+ if(n == 0){
+ return(diag(4))
+ }else{
+ return(A%*%A^(n-1))
+ }
+ }

观察:

> power(A,4)
[,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]   10    1    0    0
[3,]   46   10    1    0 
[4,]  146   46   10    1

这与我的计算器得到的价值不同,而且我试图弄清楚我做错了什么。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

我们可以使用%^%

中的library(expm)
library(expm)
A%*%(A%^%3)

在函数中使用它

power <- function(A,n){
   if(n == 0){
     return(diag(4))
   }else{
 return(A%*%(A%^%(n-1)))
 }
}

power(A,4)
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    0    0
#[2,]    8    1    0    0
#[3,]   36    8    1    0
#[4,]  120   36    8    1

根据?matpow

中的说明
  

计算矩阵的k次幂。而'x ^ k'计算        元素明智幂,'x%^%k'对应于k-1矩阵        乘法,'x%%x%%...%*%x'。

base R Reduce选项为%*% %^%(但与Reduce(`%*%`,replicate(4, A, simplify=FALSE)) 相比速度较慢。

power1 <- function(A,n){
   if(n == 0){
    return(diag(4))
   }else{
    Reduce(`%*%`,replicate(n, A, simplify=FALSE))
   }
}

power1(A,4)
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    0    0
#[2,]    8    1    0    0
#[3,]   36    8    1    0
#[4,]  120   36    8    1

在一个函数中,

 if (combo.childNodes.length == 0) return;

答案 1 :(得分:1)

您计算矩阵产品的方式存在问题。我在power()函数中使用了while循环。它只是将输入矩阵与自身n倍相乘,然后返回结果。这是一个基础R解决方案,它是你已经走向的方向的延续。

A <- matrix(c(1,2,3,4,0,1,2,3,0,0,1,2,0,0,0,1),nrow=4,ncol=4)

power <- function(A,n){
    B <- diag(nrow(A))
    if (n == 0) {
    return(diag(nrow(A)))
    } else {
        while (n > 0) {
            B <- A%*%B
            n <- n - 1
        }
        return(B)
    }
}

> power(A, 4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    8    1    0    0
[3,]   36    8    1    0
[4,]  120   36    8    1

答案 2 :(得分:0)

我假设您想要进行矩阵的多重化。您必须首先将矩阵乘以然后尝试使用相同的幂来乘以它们,这样您就可以做两件事

  1. 编写代码以乘以矩阵。
  2. 循环代码以繁殖。