2015-07-01 3 views
-2

У меня есть матрица образца, какКак выполнить сложную операцию зацикливания на матрице

5 4 3 
2 6 8 
1 9 7 

и я хочу выход как

max(5*6,5*8,5*9,5*7) // i!=j condition 
max(4*2,4*8,4*1,4*7) 
max(3*2,3*6,3*1,3*9) 

И так далее ...

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

+5

Вы должны быть в состоянии решить эту проблему с помощью 'for' петли самостоятельно. Продемонстрируйте некоторые усилия в своем вопросе. – Roland

+0

Этот код дает максимальное значение, полученное для первой строки, мне нужна такая же операция для всех строк, если условие «i, не равное j» остается таким же во всех строках. –

ответ

2

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

sapply(1:ncol(m), function(j) sapply(1:nrow(m), function(i) max(m[i,j]*m[-i,-j]))) 
#  [,1] [,2] [,3] 
# [1,] 45 32 27 
# [2,] 18 42 72 
# [3,] 8 72 42 

данных:

(m <- matrix(c(5, 2, 1, 4, 6, 9, 3, 8, 7), nrow=3)) 
#  [,1] [,2] [,3] 
# [1,] 5 4 3 
# [2,] 2 6 8 
# [3,] 1 9 7 
+0

. Для неотрицательных чисел должно быть быстрее отделить умножение: 'm [i, j] * max (m [-i, -j])' Нет идеи, если это область действия приложения OP. – Frank

+0

@Frank Я просто переместил 'max' за пределы умножения на адрес комментария SvenHohenstein, что мое предыдущее решение (именно то, что вы описываете) работало только для неотрицательных матриц. Боюсь, у нас не может быть двух способов. Опять же, я бы предположил, что эффективность, которую вы описываете, довольно мала. – josliber

+0

О, хорошо. Я не заметил вашей первой итерации ответа. Да, по мере того, как размер масштабируется, «макс» должен доминировать над стоимостью, я думаю. – Frank