Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何用它们的行和列分布填充矩阵_Algorithm_Matlab_Matrix_Encoding_Forwarderrorcorrection - Fatal编程技术网

Algorithm 如何用它们的行和列分布填充矩阵

Algorithm 如何用它们的行和列分布填充矩阵,algorithm,matlab,matrix,encoding,forwarderrorcorrection,Algorithm,Matlab,Matrix,Encoding,Forwarderrorcorrection,我需要用1和0填充矩阵。提供的数据是矩阵的维度和1的行和列分布(通过两个不同的向量,因为每种情况下它们可能不同)。我们有两个向量,v和h,它们的元素定义为: v_i = i-th element of vector v. 表示权重i的列的分数(包含i1的列占总列的分数) 表示权重i行的分数(包含i1的行占总行数的分数) 考虑的程序是指MacKay-Neal算法。包括按列从左到右填充矩阵。选择每列的权重以获得1的有效分布。这些1在每个文件中的位置在尚未满的文件中随机选择 请在下面找到我的代码。

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

v_i = i-th element of vector v. 
表示权重
i
的列的分数(包含
i
1的列占总列的分数)

表示权重
i
行的分数(包含
i
1的行占总行数的分数)

考虑的程序是指MacKay-Neal算法。包括按列从左到右填充矩阵。选择每列的权重以获得1的有效分布。这些1在每个文件中的位置在尚未满的文件中随机选择

请在下面找到我的代码。你也可以找到我正在咨询的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
,它们的元素可以取01之间的任何值,只要它们的和在这两种情况下都等于1,并且第一个元素在这两种情况下都等于0。另外,
k
tan取01之间的任何值

fh_i = i-th element of vector h. 
非常感谢您的关注


2017年1月6日编辑 下面是上面使用的示例值。在那里你还可以查看我的代码的更新版本(之前的所有句子都保持不变)

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

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


2017年3月1日编辑 我现在有另一个问题与向量的构造有关
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];

非常感谢,并致以最诚挚的问候。

我相信你是对的,你的两个观点都是课堂讲稿中的错误

我认为,如果我们更换:

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

的第3.2节包含此版本的算法(其中
u
扮演
β

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

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

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

算法1 (我相信这就是原版
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