На самом деле это не так сложно:
mat[nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) > -1/2]
# [1] 4 7 10 11 13 14 15
Представьте, что ваша картинка - это верхняя правая четверть пространства R ^ 2.То есть нижний левый угол соответствует (0,0) и т. Д.Пусть nc
и nr
соответствуют количеству столбцов и строк в вашей матрице соответственно.Кроме того, пусть c
и r
соответствуют столбцу и строке конкретной ячейки.
Легко видеть, что уравнение диагональной линии равно y = nr - nr / nc * x
в обычных обозначениях.Осталось вычислить область, соответствующую каждой (c, r) ячейке.Верхняя строка этой ячейки находится на уровне y = nr - r + 1
и идет от x = c - 1
до x = c
.Всякий раз, когда эта область больше 1/2, мы включаем эту ячейку в ответ.Матрица этих областей задается как
nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) + 1
. Хотя матрица не является квадратной, симметрия все еще остается большой, и, если бы матрица была огромной, вы могли бы использовать это и вычислить области только для 25% ~ ячеек, но я предполагаю, что это не тот случай.
Из-за этой симметрии нижнюю треугольную матрицу также очень легко получить:
mat[nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) < -1/2]
# [1] 1 2 3 5 6 9 12