【发布时间】:2017-01-05 15:25:52
【问题描述】:
我需要用 1 和 0 填充矩阵。提供的数据是矩阵的维度和1的行和列分布(通过两个不同的向量,因为它们在每种情况下可能不同)。所以我们有两个向量,v 和h,它们的元素定义为:
v_i = i-th element of vector v.
表示重量为i 的列所占的比例(包含i 1 的列占总数的比例)。
fh_i = i-th element of vector h.
表示重量为i 的行所占的比例(包含i1 的行占总数的比例)。
考虑的过程是指MacKay Neal 算法。由从左到右按列填充矩阵组成。选择每列的权重以获得1 的有效分布。这些 1 在每个文件中的位置是在尚未满的那些之间随机选择的。
请在下面找到我的代码。您还可以找到in this webpage 我正在查阅的 PDF 文档,以执行我的项目的这一部分。我之前提到的所有内容都可以在第 10 页和第 11 页找到。MacKay 算法在第 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 数量。
就我而言,一切都很顺利,直到我在第 20 行执行减法 a = a - c。我花了整整一个下午的时间绞尽脑汁,最终提出了两个问题:
-
为什么这个减法是
a = a - c而不是b = b - [one unity in each corresponding position from c]?对于链接中附加的 PDF 中的伪代码之前的理论解释中出现的内容,这对我来说更有意义。 -
如果您选择 b 的一个子集(其中包含至少两个相等的值)来执行以下
H矩阵中的 1 分配,会发生什么情况?对我来说,a_i1's 似乎是一个完全可行的情况,不会添加,但会更少。
如果有人也可以帮助我解决任务的最后一部分,在伪代码中暗示长度为 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这两个向量,只要它们的和等于1 在这两种情况下,第一个元素也等于 0 在这两种情况下。此外,k tan 取 0 和 1 之间的任何值。
非常感谢您的关注!
于 2017 年 6 月 1 日编辑
按照上面使用的示例值,I encountered the following problem。在那里你也可以查看我的代码的更新版本(所有之前的句子都保持不变)。
在这种情况下,给定h 分布,β 向量中的每个元素可能只有三个不同的值(2、6 和 7)。对于 αi 大于 3 的情况(在我们的示例中它可以达到 10),向量 c 将至少有两个相等的值,尽管在“datasample”句子中试图避免这种情况。
我想这就是您之前提到该算法可能不会总是终止时所指的内容 - 但在这种情况下,它永远不会终止!
于 2017 年 1 月 3 日编辑
我现在有另一个与向量a/b 的构造有关的问题。我的问题是,当N 很高时,例如N = 100,因此我们矩阵的维度是,对于r = 0.5,(50x100)我们将有一个向量表示长度为1x100 的列权重的分布。让我举一个简单的例子。例如,我们可能有一个由v_2 = 0.8258 组成的列分布(让我们回忆一下,根据规范v_1 = 0),其余的值直到v_100 要小得多,例如在我们的v_i = 0.0018 左右案例。
在这种情况下,我们的代码将无法运行,因为当乘以 N = 100 时,该值将远低于 1(有关更多详细信息,请参阅下面我提出的解决方案)。也就是说,不会有任何权重为 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];
在此先感谢您,并致以最诚挚的问候。
【问题讨论】:
-
提供简单的输入和预期的输出会很有帮助
-
晚上好 Rahnema,非常感谢您的及时回复。请查看我的最后几行代码。在那里你可能会找到传递给我的函数的参数。预期的输出应该是一个由“1”和“0”组成的矩阵。感谢您的关注!
-
我想过一个可能的答案,但我想先和你讨论一下它的可行性。如果我们将所有参数四舍五入为两位数怎么办?也许通过在表达之前这样做,如果可能的话,我们也许可以避免像我上次更新中所说的任何问题。
标签: algorithm matlab matrix encoding forwarderrorcorrection