克罗内克积函数定义
Kronecker product function definition
我有这段代码来定义一个函数,该函数可以用来做 kronecker 乘积,但之后就不起作用了
kron <- function(A,B){
nfila = nrow(A)*nrow(B)
ncolum = ncol(A)*ncol(B)
m = matrix(NA, nrow = nfila, ncol = ncolum)
for (i in 1:nfila){
for (j in 1:ncol(A)){
m[i,j]=(A[i,j]*B)
}
}
return(m)}
我用了这两个矩阵
A <- matrix(c(1, 2, 3, 1), nrow = 2, ncol = 2, byrow = TRUE)
B <- matrix(c(0, 3, 2, 1), nrow = 2, ncol = 2, byrow = TRUE)
要检查 de 处理是否正常,应该是 运行 kron(A,B) 必须等于 kronecker(A,B)
如果 c<-kronecker(A,B)
和 m<-kron(A,B)
。然后,C==m
.
在 R 中你可以这样做:
library(purrr)
kron <- function(A, B){
map(seq_len(nrow(A)), ~do.call("cbind", map(A[.x,], ~.x * B))) %>%
do.call("rbind", .)
}
内循环(映射):将矩阵A行中的每个元素与矩阵B相乘。最后绑定列
外循环(map):通过矩阵A的行迭代内循环。最后绑定行
您的代码存在问题,因为 A[i,j]*B
是与 B
具有相同维数的矩阵,您希望将其放在单单元格 (i,j)
.
中
您可以将代码修改成这样:
kron <- function(A,B){
m <- matrix(0, nrow = nrow(A)*nrow(B), ncol = ncol(A)*ncol(B))
for (i in seq_len(nrow(A))){
cur_rows <- seq_len(nrow(B)) + (i-1)*nrow(B)
for (j in seq_len(ncol(A)))
m[cur_rows, seq_len(ncol(B)) + (j-1)*ncol(B)] <- A[i,j]*B
}
m
}
我有这段代码来定义一个函数,该函数可以用来做 kronecker 乘积,但之后就不起作用了
kron <- function(A,B){
nfila = nrow(A)*nrow(B)
ncolum = ncol(A)*ncol(B)
m = matrix(NA, nrow = nfila, ncol = ncolum)
for (i in 1:nfila){
for (j in 1:ncol(A)){
m[i,j]=(A[i,j]*B)
}
}
return(m)}
我用了这两个矩阵
A <- matrix(c(1, 2, 3, 1), nrow = 2, ncol = 2, byrow = TRUE)
B <- matrix(c(0, 3, 2, 1), nrow = 2, ncol = 2, byrow = TRUE)
要检查 de 处理是否正常,应该是 运行 kron(A,B) 必须等于 kronecker(A,B)
如果 c<-kronecker(A,B)
和 m<-kron(A,B)
。然后,C==m
.
在 R 中你可以这样做:
library(purrr)
kron <- function(A, B){
map(seq_len(nrow(A)), ~do.call("cbind", map(A[.x,], ~.x * B))) %>%
do.call("rbind", .)
}
内循环(映射):将矩阵A行中的每个元素与矩阵B相乘。最后绑定列
外循环(map):通过矩阵A的行迭代内循环。最后绑定行
您的代码存在问题,因为 A[i,j]*B
是与 B
具有相同维数的矩阵,您希望将其放在单单元格 (i,j)
.
您可以将代码修改成这样:
kron <- function(A,B){
m <- matrix(0, nrow = nrow(A)*nrow(B), ncol = ncol(A)*ncol(B))
for (i in seq_len(nrow(A))){
cur_rows <- seq_len(nrow(B)) + (i-1)*nrow(B)
for (j in seq_len(ncol(A)))
m[cur_rows, seq_len(ncol(B)) + (j-1)*ncol(B)] <- A[i,j]*B
}
m
}