Получить верхнюю треугольную матрицу из несимметричной матрицы - PullRequest
0 голосов
/ 25 октября 2018

Есть ли простой способ получить верхнюю (или нижнюю) треугольную матрицу несимметричной матрицы в R?Для симметричной матрицы это может быть достигнуто с помощью mat[upper.tri(mat)], но как насчет несимметричной матрицы?Здесь определение верхней треугольной матрицы выглядит следующим образом: если ячейка, имеющая более 1/2 своей части, принадлежит верхнему правому углу матрицы, разделенной диагональной линией, то эта ячейка принадлежит верхней треугольной матрице (например,красная часть на рисунке).

Спасибо.enter image description here

1 Ответ

0 голосов
/ 25 октября 2018

На самом деле это не так сложно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...