克罗内克积函数定义

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
}