【问题标题】:How to fill up a matrix with ones from their row and column distributions如何用行和列分布中的矩阵填充矩阵
【发布时间】:2017-01-05 15:25:52
【问题描述】:

我需要用 10 填充矩阵。提供的数据是矩阵的维度和1的行和列分布(通过两个不同的向量,因为它们在每种情况下可能不同)。所以我们有两个向量,vh,它们的元素定义为:

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

请注意,ab 值分别指的是附加文本伪代码中使用的 alphabeta 变量。它们的值表示每种情况下每列和文件的 1 数量。

就我而言,一切都很顺利,直到我在第 20 行执行减法 a = a - c。我花了整整一个下午的时间绞尽脑汁,最终提出了两个问题:

  • 为什么这个减法是a = a - c 而不是b = b - [one unity in each corresponding position from c]?对于链接中附加的 PDF 中的伪代码之前的理论解释中出现的内容,这对我来说更有意义。

  • 如果您选择 b 的一个子集(其中包含至少两个相等的值)来执行以下 H 矩阵中的 1 分配,会发生什么情况?对我来说,a_i 1'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]

对于vh这两个向量,只要它们的和等于1 在这两种情况下,第一个元素也等于 0 在这两种情况下。此外,k tan 取 01 之间的任何值。

非常感谢您的关注!


于 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


【解决方案1】:

我相信你是对的,你的两点都是课堂笔记中的错误。

我认为如果我们替换它会更有意义:

c = random subset of β, of size αi
for j = 1 : αi do
   H(cj , i) = 1
end for
α = α − c

c = random distinct subset of β, of size αi (not allowed to return elements of the same value)
for j = 1 : αi do
   H(cj , i) = 1
end for
β = β − c

"NOVEL CONSTRUCTION OF SHORT LENGTH LDPC CODES FOR SIMPLE DECODING" by Fatma A. Newagy, Yasmine A. Fahmy, and Magdi M. S. El-Soudani 的第 3.2 节包含此版本的算法(u 扮演β 的角色)

调整 Matlab 代码的一种简单方法是简单地重复数据采样步骤,直到所有元素都不同。

请注意,此算法可能不会总是终止,因此我建议您跟踪重试次数,如果此次数过高,则重新开始(从开头或之前的几步)。

请注意,该算法似乎有两个主要变体:

算法 1

(我相信这是原始的 MacKay Neal 算法)

长度等于行数的向量存储每行所需的权重。

当随机选择行样本时,从向量中的相应条目中减去 1,以标记这些行现在具有较小的所需权重。

算法 2

(我相信这是一个普遍的改进。)

为了提高获得正确行分布的机会,最好将样本偏向需要更多权重的行。

这是通过准备一个长度等于整个矩阵中 1 的总数的向量来完成的。向量的元素对应行号。

此向量的随机样本提供一组行号。这些条目将从向量中删除。

因此,例如,如果我们希望最终在第 2 行有四个 1,那么数字 2(对应于第 2 行)将在向量中出现四次。这意味着第 2 行将被选中四次,因此最终会得到四个 1。

我相信伪代码指的是第二种算法。

这意味着如果β = [1,1,2,2,3,3] 并且我们选择[2,3] 的向量c,那么操作β-c 应该产生输出[1,1,2,3]

【讨论】:

  • 晚上好,彼得,非常感谢您的及时回复。虽然我还有一个关于你的 'β = β - c' 减法的问题。这种减法不应该只是从通过“datasample”命令获取的 β 的这些位置中减去一个单位吗?关于这一点,我仍然不知道如何处理这个问题。我的意思是,“数据样本”可能会为您提供一些来自 β 的值(而不是它们的位置 - 此外,β 可能很容易有一些重复的值),因此您无法执行减法,因为两个向量可能有不同的维度。我希望我自己说清楚.最好的问候!
  • 令人困惑的是,我认为该算法可能有两种变体。我已经添加了对两者的一些解释。我相信您的评论建议使用算法 1。这很好用(它可能会慢一点),但我相信伪代码指的是使用算法 2。
  • 晚上好,彼得,再次感谢您的支持。我发现了一些新问题,所以我编辑了我的第一条消息,包括我的 Matlab 屏幕的屏幕截图。如果样式不准确,请见谅——这是我第一次在 Stackoverflow 上发帖。关于我的问题,算法没有完成,因为正如我所推测的那样,β 最终会在此之前用完值。此外,随着 αi 的增加,β 的某些值无法避免在 c 中重复。我想你指的是当提到算法并不总是完成时。但在这种情况下,它会这样做吗?最好的问候
  • 我明白你的意思。我想知道我们是否需要以不同的方式解释 h 输入向量?如果 h 向量为每一行指定所需的权重,这似乎更有意义。所以要让 100% 的行的权重为 50%,我们将输入 h=[0.5,0.5,...,0.5,0.5],而不是当前的 [0,0,0,0,0,1,0 ,0]。这个 h 向量不会单独为 1,但对于算法的其余部分似乎更有意义。但是,这开始让人觉得有太多的更正,我现在担心我把你带错了方向,对不起!
  • 你不用找借口!事实上,我非常感谢您帮助我:) 您是否提出了另一种通过定义 h 来实现这一点的选择?我只是尝试按照我在消息中首先链接的论文中的说明进行操作(you can find it here;第 10 页是 MacKay 算法讨论的开始,第 14 页可以找到相应的伪代码)。但我想应该还有更多的选择!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多