Установка n элементов матрицы в ноль

#r #algorithm

#r #алгоритм

Вопрос:

Я хотел бы установить n элементы матрицы в ноль, ниже приведена моя попытка решить эту проблему путем генерации uique пар целых чисел.

Как сгенерировать уникальные пары целых чисел из равномерного распределения (x,y) , например, если нам нужны три пары с x и y из диапазона 1: 1000, то одним из решений является : (1,888),(743,743),(743,4)
если я использую cbind(sample(1:1000,100,replace=TRUE),sample(1:1000,100,replace=TRUE)) для генерации 100 пар, я рискую, что они могут повторяться несколько раз. Как сделать это векторизованным способом (без циклов)?

Пары не могут повторяться, но их элементы могут, например: (1,2),(2,1),(1,1),(2,2),(23,23),(86,52) правильный вывод для диапазона 1: 100 и шести пар

Комментарии:

1. чтобы уточнить, вы разрешаете повторение пар, например (1,2) (1,2), но не разрешаете повторение элементов пары, например (1,1), (2,2)?

2. @Рэнди Лай нет, я хочу обратного

3. replace=TRUE Означает ли это, что вы выполняете выборку с заменой? если это так, вы могли бы просто выбрать случайным образом в интервале [1, 1000*1000] без замены, а затем преобразовать их в пары.

4. О, поскольку вы использовали replace=TRUE . Я думал, вы разрешаете повторение пар.

5. @Patrick87 извините, я неправильно истолковал ваш комментарий…

Ответ №1:

Вы можете выбирать целые числа, а затем сопоставлять целые числа с парами, подобными этой:

 v <- sample.int(1000^2, size = 100, replace = F)
foo <- function(x) cbind(((x-1) %/% 10)   1, ((x-1) %% 10)   1)
foo(v)
  

Это избавляет вас от необходимости создавать весь список для выборки.

Ответ №2:

Если вы хотите обнулить некоторые записи матрицы, есть более простой способ. Вы можете просто сделать

 A[sample.int(1000*1000, 100, replace=FALSE)] = 0
  

где A находится ваша матрица.
Поскольку элементы извлекаются по столбцам, вам не нужно преобразовывать индекс в пару (строка, столбец).

Комментарии:

1. принято к обсуждению, см. Комментарии под вопросом

Ответ №3:

Ниже приведен псевдокод для того, что вы хотите.

 Store M x N matrix --> ArrayM of one dimension and size M x N

For i = 1 to n    // n is the number of zeros you want

    Generate RandomInteger in the interval [1, M x N - i]
    Set aside the (row,col) coordinates of the element as a Zero element
    ReCreate ArrayM, now of size M x N - 1 containing remaining elements (and their original x,y addresses)
    // you dont have to recreate it, you can implement it using some linked list

 Loop i