我试图定义一个函数来操作R中的字符串矩阵。
{+,*}矩阵乘法
两个平方矩阵的{+,*}-乘积
A.
和
B
维数为n的是一个矩阵
C
由以下元素定义:
C
i、 j
=总和
k=1,。。。,n
A.
i、 k
*
B
k、 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元素,删除它,因为它不会影响计算。
此外,我们正在乘以等维矩阵,因此每个元素
C
i、 j
=总和
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
其中乘法是以与符号乘法类似的方式定义的:
锰
i、 j
=0如果
M
i、 ,。
或
N
j
为0
锰
i、 j
=粘贴(
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)。
我该怎么办?
非常感谢。
附言:您可以使用一个简单的示例矩阵来测试代码
Matr <- matrix(c("11","12","13","21","22","23","31","32","33"),dim,dim)
和跑步
Mult(Matr,Matr)