【发布时间】:2013-03-18 07:22:33
【问题描述】:
我正在尝试在 R 中定义一个操作字符串矩阵的函数。
{+,*} 矩阵乘法
两个n维方阵A和B的{+,*}积是一个由元素定义的矩阵C : Ci,j = Sumk=1,...,nAi, k * Bk,j.
例如,考虑矩阵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)。
必须尊重一些常见的属性,即分配属性和 0 元素属性。因此,如果 a <- c("q",0,"w") 和 b <- c("e") 然后 a*b <- c("qe",0,"we") (我们应该随意忘记 0 元素,将其删除,因为它不会影响计算。
此外,我们将等维矩阵相乘,因此每个元素 Ci,j = Sumk=1,...,nAi,k * Bk,j 现在读作c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")。
为了简单起见,让我们考虑 B 总是一个 simple 矩阵,这意味着它的每个元素都是原子字符串,而不是字符串的串联(概括是后续的步骤)。
让我们举个例子。让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(s1,s2,...) 作为 i,j 元素。作为输出,我想要一个矩阵 MN = M x N,其中乘法的定义类似于符号乘法:
MNi,j = 0 如果 Mi,. 或 N.,j 为 0
MNi,j = paste(Mi, .,N.,j) 否则(使用paste()的distributive属性)
我给出了基本行/列粘贴函数的定义(错误,未正确检查零)
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)。
我该怎么办?
谢谢!
附:您可以使用简单的示例矩阵来测试代码
Matr <- matrix(c("11","12","13","21","22","23","31","32","33"),dim,dim)
正在运行
Mult(Matr,Matr)
【问题讨论】:
-
它不起作用,因为在矩阵“槽”中不能有向量(长度 >= 2),即,不能将
c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")分配给M[i,j]。正如我在下面的 cmets 中指出的那样,您必须首先将该向量 折叠 为长度为 1 的字符串。 -
好的,这就是你的意思。然后,我可能不得不使用一些分隔符将它折叠成一个长度为一的字符串,并在进行乘法之前再次分解它。希望这是可行的。
标签: string r matrix multidimensional-array exponentiation