如何使用行和列分布中的矩阵填充矩阵

时间:2017-01-05 15:25:53

标签: algorithm matlab matrix encoding forwarderrorcorrection

我需要用'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的行数(行数除以总数,包含i'1)。

考虑的程序是指 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 - [c中每个对应位置的一个整数]?对于链接中附带的PDF中伪代码之前的理论解释中出现的内容,对我来说更有意义。

  • 如果您选择包含至少两个相等值的b子集来执行H矩阵中的'1'的分配,会发生什么?对我而言,似乎是一个非常可行的情况,其中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之间的任何值。

非常感谢您的关注!

编辑于06/01/2017

使用上面的示例值I encountered the following problem。在那里你也可以查看我的代码的更新版本(之前的所有句子保持不变)。

在这种情况下,给定'h'分布,对于来自β向量的每个元素,可能只有三个不同的值(2,6和7)。对于αi大于3的情况(在我们的例子中它可以达到10),尽管在'datasample'句子中试图避免这样,但是向量c将至少有两个相等的值。

我想当你提到这个算法可能并不总是终止时,这就是你之前提到的那个 - 但在这种情况下,它永远不会这样做!

编辑于2017年1月1日

我现在有另一个与构建向量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(有关详细信息,请参阅下面的建议解决方案)。也就是说,即使所有列的总和根据理论达到单位,也不会有任何重量为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];

非常感谢提前和最好的问候。

2 个答案:

答案 0 :(得分:2)

我相信你是对的,你的两点都是讲义中的错误。

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

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行中有4个1,那么数字2(对应于第2行)将在向量中出现4次。这意味着第2行将被选中四次,因此将最终得到4个1。

我认为伪代码是指第二种算法。

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

答案 1 :(得分:2)

好吧,好像我终于成功了!

我猜测,我对附加的伪代码有两个误解。这是一个适合我的解决方案:

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

b_i = 1:length(b);

for i=1:N
    for j=1:1:length(b)
    if b(j) == 0
        b_i = setdiff(b_i,b);
    end
    end
    c = datasample(b_i,a(i),'Replace',false);
    c_i = zeros(length(b));
    for j=1:a(i) 
        H(c(j),i)=1;
        c_i(1,c(j))=1;
    end
    b = b - c_i;
end

% Removal of length-4 cycles

for i=1:N*(1-r)-1
    for j=i+1:N*(1-r)
       w = and(H(i,:),H(j,:));
       c1 = find(w);
       lc = length(c1);
       if lc > 1
           % If found, flip one 1 to 0 in the row with less number of 1s
           if length(find(H(i,:))) < length(find(H(j,:)))
           % Repeat the process until only one column left
           for cc = 1:(lc-1)
               H(j,c1(cc)) = 0;
           end
           else
           for cc = 1:(lc-1)
               H(i,c1(cc)) = 0;
           end
           end
       end
    end
end

正如你们每个人所看到的,我最终用“ b = b - c_i ”取代了“ a = a - c ”减法。什么是c_i?它只是一个向量,包含从我从b中提取的元素的索引中的元素。通过这样做,我终于可以在没有任何其他问题的情况下实现H矩阵。

感谢大家的支持和最诚挚的问候!

编辑于2017年3月13日

如第一个问题所述,此代码不适用于任何学位分发。

我想让它适用于那些获得相当不规则程度分布的情况。例如,让我们有以下参数:

v = [0    0.6895    0.0011    0.0003    0.0001    0.0525    0.0009    0.0111    0.0805    0.0077    0.0097    0.0019    0.0011    0.0009    0.0008    0.0019    0.0014    0.0006    0.0012    0.0031    0.0007    0.0022    0.0019    0.0006    0.0014    0.0096    0.0023    0.0018    0.0015    0.0074    0.0022    0.0011    0.0005    0.0010    0.0003    0.0017    0.0006    0.0007    0.0009    0.0033    0.0365    0.0030    0.0006    0.0449    0.0018    0.0000    0.0021    0.0012    0.0015    0.0005];
h = [0    0.0178    0.0167    0.0004    0.0034    0.0020    0.0121    0.0106    0.0063    0.0064    0.0025    0.0061    0.0005    0.0158    0.0150    0.0202    0.0036    0.0149    0.0020    0.0034    0.0140    0.0035    0.0054    0.0163    0.0054    0.0017    0.0202    0.0195    0.0183    0.0007    0.0022    0.0193    0.0196    0.0178    0.0171    0.0021    0.0096    0.0033    0.0090    0.0199    0.0061    0.0076    0.0101    0.0177    0.0188    0.0110    0.0136    0.0092    0.0025    0.0199    0.0148    0.0137    0.0143    0.0036    0.0010    0.0011    0.0077    0.0040    0.0054    0.0164    0.0136    0.0127    0.0176    0.0147    0.0170    0.0040    0.0173    0.0008    0.0200    0.0017    0.0030    0.0016    0.0081    0.0030    0.0118    0.0167    0.0199    0.0157    0.0186    0.0056    0.0166    0.0110    0.0140    0.0095    0.0108    0.0008    0.0107    0.0038    0.0112    0.0078    0.0063    0.0145    0.0192    0.0044    0.0158    0.0062    0.0096    0.0100    0.0039    0.0072];
N = 100;
r = 0.5;

你可以帮我解决一下吗?

v和h来自优化问题(我希望我能正确解决)。您可以在我的帖子开头找到有关它的更多信息。

非常感谢提前和最好的问候。