【问题标题】:How to iterate over elements in a sparse matrix in matlab?如何在matlab中迭代稀疏矩阵中的元素?
【发布时间】:2015-10-03 16:05:59
【问题描述】:

我正在 matlab 中为 LDPC 信念传播解码器编写代码。 我遵循以下指定的算法: http://www.ece.umd.edu/~tta/resources/LDPC.pdf 第 6 页。

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

我会更具体:假设我有以下 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 是一个稀疏矩阵。

【问题讨论】:

  • 你的意思是迭代稀疏矩阵... 访问稀疏矩阵?迭代只是表示一个过程的重复。
  • @JJMDriessen - 遍历元素意味着单独访问每个元素。它是非常常用的词汇……比如在 C++ 中,您可以迭代 std::vector 容器中的元素。

标签: matlab


【解决方案1】:

假设你有一个稀疏矩阵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

当然你可以将ii和jj重命名为row_index和column_index。

【讨论】:

  • find 是正确的选择。请注意,这会迭代所有非零元素,而不是所有元素。 [ii,jj] = find(S==1) 会迭代所有的。
  • 是否有没有 for 循环的更快方法?
  • 瓦乌兹尔?因为这段代码要运行多次,需要很快。
【解决方案2】:

以下内容执行您的代码 sn-p 所做的事情,但并不完全迭代稀疏矩阵,就像问题的标题所暗示的那样。另外,我不确定我的其他答案中的方法是否比这更快或更慢。

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

messages_llr_matrix = bsxfun(@times, parity_check_matrix, code_word_aprior_prob)

可能就够了。

请测试这是否真的给出了正确的答案,如果您真的以速度为目标,请测试哪种方式更快。

【讨论】:

  • 您好,我对您的建议有疑问。 @times 用于乘法。我不需要那个。请帮帮我。
  • 你测试过代码吗?你确认结果不是你想要的吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多