我正在尝试在 R 中定义一个操作字符串矩阵的函数。
{+,*} 矩阵乘法
两个n 维方阵A和B的 {+,*}-乘积是由以下元素定义的矩阵C: C i,j = Sum k=1,...,n A i,k * B k, Ĵ。
例如,考虑矩阵 M <- matrix(c(a,b,0,0,c,d,0,0,e),3,3)
。那么 M 乘以 M 就是 M <- matrix(c(a^2,a*b+b*c,b*d,0,c^2,c*d+d*e,0,0,e^2),3,3)
。
{c(,),paste0(,)} 矩阵乘法
我想实现的这个操作的规则与前面所说的乘法相同,其中的基本突变是总和应该是一个连接,而乘积应该是一个粘贴。换句话说,我们在前面的公式中找到a+b
,现在输出应该是“c(a,b)”,当我们找到 时a*b
,现在我们应该将其读为paste0(a,b)
。
一些通常的属性必须得到尊重,即分配属性和零元素属性。因此,如果a <- c("q",0,"w")
和b <- c("e")
然后a*b <- c("qe",0,"we")
(我们应该随意忘记 0 元素,将其删除,因为它不会影响计算。
此外,我们正在乘以等维矩阵,因此每个元素 C i,j = Sum k=1,...,n A i,k * B k,j现在被读作 c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")
。
为了简单起见,让我们认为B始终是一个简单的矩阵,这意味着它的每个元素都是原子字符串,而不是字符串的串联(泛化是后续步骤)。
让我们举个例子。让 A <- matrix(c("a","b",0,0,"c","d",0,0,"e"),3,3)
,然后mult(A,A) = matrix(c("aa",c("ab","bc"),"bd",0,"cc",c("cd","de"),0,0,"ee"),3,3)
和mult(mult(A,A),A) = matrix(c("aaa",c("aab","abc","bcc"),c("abd","bcd","bde"),0,"ccc",c("ccd","cde","dee"),0,0,"eee"),3,3)
。
部分(不工作)实施
考虑作为输入一对 nxn 矩阵M , N,无论是 0 还是字符串数组 c( s 1 , s 2 ,...) 作为i,j个元素。作为输出,我想要一个矩阵MN = M x N,其中乘法的定义与符号乘法类似:
如果M i,则MN i,j = 0 。或N .,j为 0 MN i,j = paste( M i,. , N .,j ) 否则(使用 的分配性质)
paste()
我给出了基本行/列粘贴函数的(错误,未正确检查零)定义为
MijPaste <- function(Row,Col){
if(Col[1]=="0"){
Mij <- 0
} else if(Row[1]=="0"){
Mij <- 0
} else
Mij <- paste(Row,Col,sep="")
return(Mij)
}
我无法从这一步转到乘法函数的正确定义,因为我想在矩阵中插入的元素 Mij 的维度不正确。因此我得到一个number of items to replace is not a multiple of replacement length
错误。我目前的实现是:
# define the dimension of the matrix, here for example 3
dim <- 3
# define the Multiplication function as an iteration of the MijPaste function
Mult <- function(M1,M2){
#allocate a matrix of dimension nxn
M <- matrix(0,dim,dim)
#for each element i,j define it as the MijPaste of row i column j
for(i in 1:dim){
for(j in 1:dim){
stringi <- M1[i,]
stringj <- M2[,j]
M[i,j] <- MijPaste(stringi,stringj)
}
}
return(M)
}
代码不起作用。我可能可以将矩阵更改为多维数组,但我希望输出可用作进一步乘法的矩阵(例如定义(MxN)xC)。
我能怎么做?
谢谢!
PS您可以使用一个简单的示例矩阵来测试代码
Matr <- matrix(c("11","12","13","21","22","23","31","32","33"),dim,dim)
并运行
Mult(Matr,Matr)