в или из цикла for в R - вычисление диагонального произведения матрицы - PullRequest
1 голос
/ 07 октября 2010

Я пытаюсь найти максимальное диагональное произведение двухзначных чисел в матрице 20x20.

Это выдает сообщение об ошибке:

i <- 17:1
z <- for (j in 1:(18-i))
        {b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}

Но это не так:

z <- for (i <- 17:1)
{for (j in 1:(18-i))
        {b <- max ((x[i,j]*x[i+1,j+1]*x[i+2,j+2]*x[i+3,j+3]))}}

но вторая версия дает мне слишком маленькое число. Почему первый не работает, я думаю, что это даст правильный ответ, но я не понимаю сообщение об ошибке.

Ответы [ 2 ]

6 голосов
/ 07 октября 2010

Это выглядит неправильно.

Нельзя присвоить результат цикла for переменной.И max() находится над скалярной переменной, что является ерундой.Наконец, матрица x не указана.Я бы повторил попытку с чем-то меньшим и, возможно, даже напечатал бы некоторые промежуточные результаты на экране.Позже вы все еще можете векторизовать решение для спринта.

1 голос
/ 08 октября 2010

На самом деле, вопреки Дирку, я считаю, что вы должны знать о векторизации в R как можно скорее. Структура цикла, которую вы пытаетесь реализовать, далека от оптимальной и фактически избыточна. Использование цикла for должно выполняться только в очень специфических случаях. Проверьте обсуждение в этот вопрос . Посмотрите на файлы справки вспомогательных функций, таких как diag(), combn(), prod() и apply().

Их легко объединить, чтобы сделать то, что вы хотите:

x <-matrix(1:400,ncol=20)

Diag <- diag(x)

Id <- combn(1:length(Diag),2)

Diag.prod <- apply(matrix(Diag[Id],ncol=2),1,prod)

Max.Diag.prod <- max(Diag.prod)

Редактировать: Вы используете фрейм данных, но вы можете использовать as.matrix(x), чтобы легко преобразовать это в матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...