2015-10-02 91 views
1

我正在写matlab中的LDPC信念传播解码器的代码。 我遵循以下指定的算法: http://www.ece.umd.edu/~tta/resources/LDPC.pdf第6页。如何迭代matlab中稀疏矩阵中的元素?

我想对此目标使用稀疏矩阵。 在此期间,我想迭代大型矩阵只有几个。 我的问题是我如何迭代只有矩阵中的那些?

我会更具体:比方说,我有以下的MATLAB代码:

for row_index = 1 : row_num 
    for coloum_index = 1 : col_num 
     if parity_check_matrix(row_index, coloum_index) 
      messages_llr_matrix(row_index, coloum_index) = ... 
       code_word_aprior_prob(coloum_index); 
     end 
    end 

这段代码使用向量“code_word_aprior_prob”并赋予它的价值矩阵中的“messages_llr_matrix”,这是该行不是零。现在,我想用稀疏矩阵执行此操作。

parity_check_matrix是一个稀疏矩阵。

+0

通过迭代稀疏矩阵,你的意思是...... *访问*稀疏矩阵?迭代只是表示重复一个过程。 –

+0

@JJMDriessen - 遍历元素意味着单独访问每个元素。这是非常常用的词汇表......就像在C++中一样,例如,您在“std :: vector”容器中遍历元素。 – rayryeng

回答

7

假设您有一个稀疏矩阵S。你可以遍历其非零元素使用

[ii,jj,ss] = find(S); 

for k=length(ii) 
    %// A nonzero element of S: ss(k) = S(ii(k),jj(k)) 
end 

虽然我不知道这将是多快。

在特定情况下,你可能会做

[ii,jj] = find(parity_check_matrix); 
for k = 1 : length(ii) 
    messages_llr_matrix(ii(k), jj(k)) = ... 
      code_word_aprior_prob(jj(k)); 
end 

当然,你可以重命名iijjrow_indexcolumn_index RESP。

+1

'find'是正确的选择。请注意,它遍历所有非零元素,而不是遍历所有元素。 '[ii,jj] = find(S == 1)'将遍历所有的1。 – Daniel

+2

@yaron另请参见['spfun'](http://es.mathworks.com/help/matlab/ref/spfun.html) –

+0

任何人?我迷失在这里。 :((((((((((((((((( – yaron

0

以下是你的代码片断所做的工作,但并不完全遍历稀疏矩阵,就像问题的标题所示。另外,我不确定在其他答案中的方法是比这更快还是更慢。

请注意,我认为,code_word_aprior_prob是一个行向量。然后做

messages_llr_matrix = bsxfun(@times, parity_check_matrix, code_word_aprior_prob) 

可能就足够了。

请测试一下,如果这实际上给出了正确的答案,并且请测试哪种方式更快,如果你真的是为了速度的目标。

+0

嗨,ia对你提出的问题有疑问。@times是用于乘法。我不需要。请帮助我。 – yaron

+0

你测试了吗?代码?你是否证实结果不是你想要的? – Wauzl