【发布时间】:2013-03-21 11:50:51
【问题描述】:
我正在尝试使用矩阵代数来处理字符串。这意味着能够使用字符串或字符串数组的连接和粘贴来创建多个类似矩阵的结构。
我之前尝试在 R 上实现这个东西,但这是不可能的,因为矩阵只能有一维条目。
我希望足够多语言无关和抽象,但为了清楚起见,我将使用类似 R 的代码。我应该明确指出,我不需要真正的矩阵,而是需要类似矩阵的结构,我们可以在其上进行类似矩阵的乘法并检索结构的 (ij) 元素。
{+,*} 矩阵乘法
两个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,...,n sub>Ai,k * Bk,j 现在读作 最后,类似结果矩阵的结构应该是我们可以再次用于计算的东西(例如,进行更复杂的计算,如 mult(mult(A,B),C) 等等......)。 一个更简单的案例 为简单起见,让我们从 让我们举个例子。让我们A定义为 问题 您将如何实现这一点?哪种语言看起来更合适?c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")。
mult(A,A)、mult(mult(A,A),A)等形式的乘积开始计算。我们也可以将 A 强制为 simple 矩阵,这意味着它的每个元素都是一维字符串,而不是字符串的串联。A <- matrix(c("a","b",0,0,"c","d",0,0,"e"),3,3)的3维矩阵,那么A乘以A应该是mult(A,A) = matrix(c("aa",c("ab","bc"),"bd",0,"cc",c("cd","de"),0,0,"ee"),3,3)和 A3 应该是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)。
【问题讨论】:
-
什么是
c()?paste0()是什么?为什么 R 社区之外的任何人都应该关心? -
我应该已经定义了 R 函数...
c(a,b,...,n)返回一个包含 n 个元素 a、b、... n 的数组;paste0(abc,def),其中 abc 和 def 是两个字符串,返回字符串abcdef。第一个函数将一个向量附加到另一个向量,第二个函数将两个或多个字符串粘贴在一起。代码是用 R 编写的,只是因为我使用的是那种语言,但问题是一个普遍的问题,关于矩阵代数下的字符串操作,这在许多问题(或可能是)中很有用,而且我不知道有什么语言在做作为内置... -
R向量运算规则下没有分配律(较短的向量重复到更长的长度),如果修剪到较短的长度也没有分配律。
-
什么意思?如果我没记错的话,
paste0(c("a","b","c"),"l")给出的c("al","bl","cl")与 (a+b+c)*l=al+bl+cl 的 相似 ...需要。 -
试试
paste0(c("a","b","c"),c("1","2"))。
标签: string r math matrix matrix-multiplication