Я пытаюсь определить функцию манипулирует матрицы строк в R.Строка в матрицах: размерный вопрос
{+, *} МАТРИЦЫ Умножение
{+, *} - произведение двух квадратных матриц и B размерности п является матрицей с определяется элементами: с I, J = Сумма к = 1, ..., п I, K * В 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)
.
{с (,), 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 элемента, сбросив его, как это не повлияет на вычисление.
Кроме того, мы умножение equaldimensioned матрицы, следовательно, каждый элемент C I, J = Сумма к = 1, ..., п я, к * B K, J теперь следует читать как c("A[i,1]B[1,j]",...,"A[i,n]B[n,j]")
.
. Для незанятости для сплетаемости рассмотрим B всегда a простая матрица, что означает, что каждый из ее элементов является атомной строкой, а не конкатенацией строки (обобщение является последующим шагом).
Приведем пример. Пусть 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)
.
ЧАСТИЧНАЯ (НЕ РАБОЧИЕ) ОСУЩЕСТВЛЕНИЕ
Рассмотрим в качестве входных пара матриц пХп М, Н с ли 0 или массив строк с (с , с , ...) как i, j элементов. Как выход я хотел бы иметь матрицу MN = M х N, где умножение определяется по аналогии с символическим умножения:
MN I, J = 0, если M я ,. или N., J М.Н. I, J = паста (М я ,., 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).
Как я могу это сделать?
Спасибо!
P.S. Вы можете проверить код, используя простой пример матрицу
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] ")' to 'M [i, j]'. Вы должны * свернуть * этот вектор на строку длиной один символ, как я указал в моих комментариях ниже. –
Хорошо, это делает вашу мысль. Тогда мне, вероятно, придется свернуть его до длины одной строки, используя некоторый разделительный символ и разбить его снова, прежде чем делать умножение. Надеюсь, это возможно. – gvdr