#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