2016-02-16 8 views
-1

Я действительно не знал, как это назвать!Элементарное сужение, из двух матриц

Я пытаюсь выполнить приведенную ниже формулу R. Вы можете в значительной степени игнорировать все для суммирования части выше линии

enter image description here

кроме Если у меня есть две матрицы

> task2 
    [,1] [,2] [,3] 
[1,] 1 3 3 
[2,] 2 5 1 

> actor 
    [,1] [,2] [,3] 
[1,] 1 5 1 
[2,] 2 4 6 
[3,] 4 3 4 

Результирующая матрица должна быть (для суммирующей части над линией)

> result 
    [,1] [,2] [,3] 
[1,] 1 0 0 
[2,] 4 1 1 

результат [1,1] = сумма (pmax (0,1-1), pmax (0,3-2), pmax (0,3-4) = 1

Я думаю, что знаю, как это сделать она с использованием вложенных циклов для, хотя я знаю, что это не так, как вы могли бы сделать это в R. Это не правильно, но это должно быть вдоль линий этого

for (i in 1:nrow(task)){ 
    for (j in 1:ncol(actor)){ 
    for (k in 1:ncol(task)){ 
     result[i,j] <- sum(pmax(0,(task[i,k]-actor[k,j)) 
    } 
    } 
} 

кто-нибудь есть какие-либо предложения о том, как атаковать Эта проблема?

+1

Проверьте требуемый выход снова. Пожалуйста, объясните, как 'result [1,3]' стал '1', когда предоставленная вами формула приводит к' sum (pmax (0,1-1), pmax (0,3-6), pmax (0,3-4)) = 0' –

+0

Извините, я подсчитал это в своей голове. Спасибо, что заметили это. – Conor

+1

Второй ряд выключен. 'Результаты [2,1]' должны быть 'sum (pmax (0,2-1), pmax (0,5-2), pmax (0,1-4)) = 4'. Как вы ожидаете, что люди помогут вам, когда вы даже не сможете написать пример? И выньте снимок, это не помогает. –

ответ

1

Из логики, представленной в примере, это должно работать. Пожалуйста, проверьте нужный результат по формуле, которую вы указали. Точные результаты зависят от первой тхпа матрицы можно сравнить с NXP матрицы так, что столбцы матрицы одного равны строками матрицы два:

t(apply(task2, 1, function(x) { 
    colSums(matrix(pmax(0,x-actor), ncol=ncol(task2))) 
})) 
#  [,1] [,2] [,3] 
# [1,] 1 0 0 
# [2,] 4 1 1 

обновления

К объясните, что делает эта функция, помогает запустить ее по одной линии за раз:

#The generalized function 
function(x) { 
    colSums(matrix(pmax(0,x-actor), ncol=ncol(task2))) 
} 

Применяется к первой строке только по repl task2[1,] где очка одним ударом x был:

colSums(matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2))) 
[1] 1 0 0 

Мы создаем новую матрицу и с сумм столбцов. Давайте рассмотрим это более подробно. В основе этой функции мы сравниваем первый ряд task2 к матрице actor:

task2[1,] - actor 
    X..1. X..2. X..3. 
[1,]  0 -4  0 
[2,]  1 -1 -3 
[3,] -1  0 -1 

Это самая важная часть. Он вычитает матрицы по желанию. Весь остальной код - это способ сделать его приятным.

Когда мы добавим pmax славная матрица, что мы выше превращается в один вектор:

pmax(0, task2[1,] - actor) 
[1] 0 1 0 0 0 0 0 0 0 

Число является правильным, но мы не можем получить сумму каждого столбца в то время как она выглядит так. Таким образом, мы превращаем его в матрицу с таким же числом столбцов с:

matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2)) 
    [,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 1 0 0 
[3,] 0 0 0 

Теперь в форме, что нам нужно.Но нам нужны только суммы каждого столбца, поэтому мы добавим colSums:

colSums(matrix(pmax(0, task2[1,] - actor), ncol=ncol(task2))) 
[1] 1 0 0 
+0

Это похоже на трюк. Большое спасибо. – Conor

+0

добро пожаловать. –

+0

Если у вас есть шанс, не могли бы вы объяснить, как работает функция (x). Я думал, что понял, но, похоже, я не могу об этом подумать. – Conor

1

Определить обобщенный внутренний продукт. Например, если f <- function(x, y) sum(x*y), то он определяет матричное умножение.

inner <- function(a,b,f) { 
    f <- match.fun(f) 
    apply(b,2,function(x)apply(a,1,function(y)f(y,x))) 
} 

Теперь используйте его с соответствующей функцией:

inner(task2, actor, function(x, y) sum(pmax(0, x - y))) 

дает:

 [,1] [,2] [,3] 
[1,] 1 0 0 
[2,] 4 1 1 
+0

Это, безусловно, выглядит красиво! Как и ответ Пьера, не могли бы вы объяснить, что делает функция (y) f (y, x)? Я хотел бы лучше понять функции. – Conor

+0

Внешнее 'apply' применяется к каждому столбцу (размер 2)' b' и внутри функции, поэтому применяется внутренняя 'apply', которая применяется к строкам (размер 1) 'a', используя значение' x' из функции во внешнем 'apply'. –

+0

Вижу, спасибо за объяснение. Я все еще использую более сложные функции приложения – Conor