2015-10-02 122 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