Я пытаюсь определить функцию, управляющую матрицами строк в R.
{+,*} УМНОЖЕНИЕ МАТРИЦ
{+,*}-произведение двух квадратных матриц A и B размерности n представляет собой матрицу C, определяемую элементами: Ci,j = суммаk=1,...,nAi,k sub> * 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)
.
Некоторые из обычных свойств должны соблюдаться, а именно дистрибутивные свойства и свойства нулевого элемента. Следовательно, если a <- c("q",0,"w")
и b <- c("e")
, то a*b <- c("qe",0,"we")
(и мы должны свободно забыть об элементе 0, отбросив его, так как он не повлияет на вычисление.
Более того, мы перемножаем матрицы одинаковой размерности, поэтому каждый элемент Ci,j = Sumk=1,...,n Ai,k * Bk,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(s1 ,s2,...) как элементы i,j. В качестве вывода я хотел бы иметь матрицу MN = M x N, где умножение определяется по аналогии с символическим умножением:
MNi,j = 0, если Mi,. или N.,j равно 0
MNi,j = paste(Mi,. sub>,N.,j) в противном случае (с использованием свойства distributive элемента 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).
Как я могу сделать?
Спасибо!
P.S. Вы можете протестировать код, используя простую примерную матрицу
Matr <- matrix(c("11","12","13","21","22","23","31","32","33"),dim,dim)
и работает
Mult(Matr,Matr)
c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")
M[i,j]
. Вы должны сначала свернуть этот вектор в строку длиной один символ, как я указал в своих комментариях ниже. - person Ferdinand.kraft   schedule 30.03.2013