2014-08-31 2 views
4

Я хотел бы, чтобы сформировать прямоугольную матрицу A с записями в замкнутом интервале [0,1], который обладает следующими свойствами:Генерация случайной матрицы с определенной ранге и мощностями

(1) size(A) = (200,2000) 
(2) rank(A) = 50 
(3) nnz(A) = 100000 

Это будет лучше, если не- нулевые элементы в A будут распадаться экспоненциально или, по крайней мере, полиномиально (я хочу значительно более мелкие значения, чем большие). Очевидно (я думаю ...), нормализующийся до [0,1], в конце концов, не является главной проблемой здесь.

Вещи я пытался это не сработало:

  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)).

  2. Сначала генерируется матрица с указанным рангом с A=rand(200,50)*rand(50,2000). Теперь, когда условие (2) удовлетворено, я раньше, как раньше. Только теперь я потерял свойство (2), так как матрица имеет почти полный ранг.

Итак ... Есть ли способ, чтобы убедиться, что оба свойства (2) и (3) выполняются одновременно?

P.S. Я хотел бы, чтобы ненулевые записи в матрице были распределены каким-то случайным/неструктурным образом (просто создание 50 ненулевых столбцов или строк не является моей целью ...).

+0

Я не знаю, как «случайный» вы можете пойти с шаблоном, не являющихся нулями. Если у вас есть 200 строк с рангом 50, у вас в основном есть 50 различных шаблонов, повторяющихся примерно по 4 раза каждый. – Shai

+0

ОК это интересный комментарий ... Я могу создать 50 случайных строк 'r_i' с' ~ 500' ненулевыми записями, а для каждой строки матрицы выбрать 'i' в случайном порядке. Это не то, к чему я стремлюсь, но это лучше, чем ничего. – DalyaG

ответ

0

Это удовлетворяет все условия, с очень высокой степенью вероятности:

A = zeros(200,2000); 
A(:,1:500) = repmat(rand(200,50),1,10); 

Затем можно затем Суффль ненулевых столбцов при желании:

A = A(:,randperm(size(A,2))); 

Матрицы имеет вертикальную структуру: в 500 colums все элементы отличны от нуля, тогда как в остальных 1500 столбцах все элементы равны нулю. (Не уверен, что это приемлемо для вашей цели).

+0

Извините, но это не моя цель ... Отредактировал вопрос в ответ. – DalyaG

0

Trivial подход:

>> A= rand(200,50); 
>> B= zeros(200,1950); 
>> A = [A B]; 
>> A = A(:,randperm(size(A,2))); 
>> rank(A) 

ans = 

    50 

>> nnz(A) 

ans = 

     10000 
+0

Не то, что я имел в виду ... Я хочу, чтобы ненулевые значения матрицы были распределены случайным образом (или, по крайней мере, с шаблоном, который не так упрощен, как предлагалось выше). – DalyaG

Смежные вопросы