Я хотел бы, чтобы сформировать прямоугольную матрицу A
с записями в замкнутом интервале [0,1]
, который обладает следующими свойствами:Генерация случайной матрицы с определенной ранге и мощностями
(1) size(A) = (200,2000)
(2) rank(A) = 50
(3) nnz(A) = 100000
Это будет лучше, если не- нулевые элементы в A
будут распадаться экспоненциально или, по крайней мере, полиномиально (я хочу значительно более мелкие значения, чем большие). Очевидно (я думаю ...), нормализующийся до [0,1]
, в конце концов, не является главной проблемой здесь.
Вещи я пытался это не сработало:
Первый генерации случайной матрицы с
A=abs(randn(200,2000))
и пороговымth = prctile(A(:),(1-(100000/(200*2000)))*100); A = A.*(A>th);
Теперь, когда свойство
(3)
удовлетворен, я снизил ранг[U,S,V] = svd(A); for i=51:200 S(i,i)=0; end A = U*S/V;
Но эта матрица имеет почти полный кардинал (я потерял должное
(3)
).Сначала генерируется матрица с указанным рангом с
A=rand(200,50)*rand(50,2000)
. Теперь, когда условие(2)
удовлетворено, я раньше, как раньше. Только теперь я потерял свойство(2)
, так как матрица имеет почти полный ранг.
Итак ... Есть ли способ, чтобы убедиться, что оба свойства (2)
и (3)
выполняются одновременно?
P.S. Я хотел бы, чтобы ненулевые записи в матрице были распределены каким-то случайным/неструктурным образом (просто создание 50 ненулевых столбцов или строк не является моей целью ...).
Я не знаю, как «случайный» вы можете пойти с шаблоном, не являющихся нулями. Если у вас есть 200 строк с рангом 50, у вас в основном есть 50 различных шаблонов, повторяющихся примерно по 4 раза каждый. – Shai
ОК это интересный комментарий ... Я могу создать 50 случайных строк 'r_i' с' ~ 500' ненулевыми записями, а для каждой строки матрицы выбрать 'i' в случайном порядке. Это не то, к чему я стремлюсь, но это лучше, чем ничего. – DalyaG