Мне нужно заполнить матрицу значениями 1 и 0. Предоставляемые данные представляют собой размеры матрицы и распределение строк и столбцов 1 (через два разных вектора, поскольку они могут быть разными для каждого случая). Итак, у нас есть два вектора, v
и h
, элементы которых определены как:
v_i = i-th element of vector v.
Указывает долю столбцов с весом i
(доля столбцов от общего количества, содержащих i
единиц).
fh_i = i-th element of vector h.
Указывает долю строк с весом i
(доля строк от общего количества, содержащих i
единиц).
Учитываемая процедура подразумевается как алгоритм Маккея Нила. Состоит из заполнения матрицы по столбцам слева направо. Вес каждого столбца выбирается так, чтобы получить допустимое распределение 1. Расположение этих 1 в каждом файле выбирается случайным образом между теми, которые еще не заполнены.
Ниже прилагается мой код. Вы также можете найти на этой веб-странице документ PDF, с которым я сейчас консультируюсь, чтобы выполнить эту часть мой проект. Все, что я упомянул ранее, можно найти на страницах 10 и 11. Алгоритм Маккея реализован в псевдокоде на странице 14.
function H = MacKayNeal(N,r,v,h)
H = zeros(N*(1-r),N);
a = [];
for i = 1:length(v)
for j = 1:(v(i)*N)
a = [a,i];
end
end
b = [];
for i = 1:length(h)
for j = 1:(h(i)*(N*(1-r)))
b = [b,i];
end
end
for i = 1:N
c = datasample(b,length(a(i)),'Replace',false);
for j = 1:a(i)
H(c(j),i) = 1;
end
a = a - c;
end
% while 1 % cycles removed
% for i = 1:(N-1)
% for j = (i+1):N
% if 1 %
% end
% end
% end
% end
end
Обратите внимание, что значения a
и b
соответственно относятся к переменным alpha
и beta
, используемым в псевдокоде прикрепленного текста. Их значения указывают количество 1 на столбец и файл в каждом случае.
В моем случае все шло нормально, пока я не выполнил вычитание a = a - c
в строке 20. Я провел целый день, ломая себе голову над этим, и в итоге возникло два вопроса:
Почему это вычитание
a = a - c
, а неb = b - [one unity in each corresponding position from c]
? Для меня было бы гораздо больше смысла в том, что появляется в теоретическом объяснении до псевдокода в PDF-файле, прикрепленном по ссылке.Что произойдет, если вы выберете подмножество b, которое содержит как минимум два равных значения, чтобы выполнить следующее присвоение 1 в
H
матрице? Мне кажется, что это вполне реальная ситуация, в которойa_i
1 не будут добавлены, но меньше того.
Если кто-нибудь может также помочь мне с решением последней части задачи, той, которая ссылается в псевдокоде на стирание длины 4 'циклов (это просто означает, что в двух отдельных столбцах не может быть двух пар 1 занимая те же должности) тоже был бы очень благодарен.
В моем случае я работаю со следующими данными:
N = 100
k = 0.5
v = [0 0.17 0.03 0.2 0 0 0.17 0.3 0.03 0.1]
h = [0 0.1 0 0 0 0.7 0.2]
Для обоих векторов v
и h
их элементы могут принимать любое значение от 0 до 1, если их сумма равна 1 в обоих случаях, и также в обоих случаях первый элемент равен 0. Кроме того, k
tan принимает любое значение от 0 до 1.
Заранее большое спасибо за внимание!
Редактировать 01.06.2017
Следуя приведенным выше образцам значений, я столкнулся со следующей проблемой. Там же вы можете посмотреть обновленную версию моего кода (все предыдущие предложения остались прежними).
В этом случае, учитывая h
распределение, может быть только три разных значения (2, 6 и 7) для каждого элемента из β
вектора. В тех случаях, когда αi
больше трех (в нашем примере это может быть до десяти), вектор c
будет иметь как минимум два равных значения, несмотря на попытки избежать этого в предложении «образец данных».
Я полагаю, это то, о чем вы имели в виду ранее, когда упоминали, что этот алгоритм не всегда может завершаться - но в этом случае он никогда не будет этого делать!
Редактировать 01/03/2017
Теперь у меня есть еще одна проблема, связанная с построением векторов a/b
. Моя проблема в том, что когда N
высокий, например N = 100
, и, следовательно, размер нашей матрицы для r = 0.5
(50x100) у нас будет вектор, представляющий распределение весов столбцов длиной 1x100. Приведу один краткий пример. Например, у нас может быть распределение столбцов, состоящее из v_2 = 0.8258
(напомним, что согласно спецификациям v_1 = 0
), а остальные значения до v_100
намного меньше, например около v_i = 0.0018
или около того в нашем случае.
В этом случае наш код не сработает, так как эти значения будут намного меньше 1 при умножении на N = 100
(подробнее см. Ниже предлагаемое мной решение). То есть не будет никаких столбцов с весом 1 или более, даже если сумма всех из них достигнет единицы согласно теории. К тому времени, когда алгоритм будет выполнен, индекс i
не достигнет N = 100
, а будет 82 для этого случая (и та же проблема происходит с векторами h / b). Чтобы лучше понять мою проблему, я рекомендую запустить свой код ниже со следующими параметрами:
N = 100;
r = 0.5;
v = [0 0.8258 0.0048 0.0033 0.0027 0.0024 0.0023 0.0022 0.0021 0.0020 0.0019 0.0019 0.0019 0.0019 0.0019 0.0019 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0016 0.0016 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0016 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0017 0.0017 0.0016 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0017 0.0016 0.0016 0.0016 0.0016 0.0016 0.0017 0.0016 0.0017 0.0016 0.0016 0.0016 0.0016 0.0016 0.0016 0.0016 0.0017];
h = [0 0.0179 0.0102 0.0277 0.0392 0.0272 0.0027 0.0055 0.0148 0.0151 0.0137 0.0259 0.0103 0.0336 0.0386 0.0049 0.0065 0.0051 0.0081 0.0441 0.0298 0.0147 0.0243 0.0207 0.0198 0.0006 0.0287 0.0425 0.0088 0.0094 0.0368 0.0090 0.0181 0.0306 0.0158 0.0325 0.0108 0.0268 0.0163 0.0448 0.0395 0.0262 0.0097 0.0114 0.0283 0.0437 0.0103 0.0058 0.0249 0.0083];
Заранее большое спасибо и с наилучшими пожеланиями.