我试图创建一个函数,一旦矩阵被提升到幂,它就会给我矩阵的值。这是我目前所做的:
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
这是一个不同于我的计算器得到的值,我试图找出我做错了什么。任何帮助都是感激的!
我们可以从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
你计算矩阵乘积的方式有问题。我在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
我假设你想做矩阵的乘法。你必须先把矩阵相乘然后用你想要的相同的乘方相乘,所以你可以做两件事
- 编写矩阵乘法代码
- 循环代码相乘。