【问题标题】:Matrix indices for creating sparse matrix用于创建稀疏矩阵的矩阵索引
【发布时间】:2015-11-24 15:04:14
【问题描述】:

我想创建一个 4 x 4 稀疏矩阵 A。我想将值(例如 1)分配给以下条目:

A(2,1), A(3,1), A(4,1)
A(2,2), A(3,2), A(4,2)
A(2,3), A(3,3), A(4,3)
A(2,4), A(3,4), A(4,4)

根据manual page,我知道我应该分别按行和列存储索引。也就是说,对于行索引,

r=[2,2,2,2,3,3,3,3,4,4,4,4]

同样,对于列索引

c=[1,2,3,4,1,2,3,4,1,2,3,4]

由于我想为每个条目分配 1,所以我使用

value = ones(1,length(r))

然后,我的稀疏矩阵将是

Matrix = sparse(r,c,value,4,4)

我的问题是这样的:

确实,我想构造一个任意维度的方阵。说,如果它是一个 10 x 10 矩阵,那么我的列向量将是

[1,2,..., 10, 1,2, ..., 10, 1,...,10, 1,...10]

对于行向量,它将是

[2,2,...,2,3,3,...,3,...,10, 10, ...,10]

我想问一下是否有一种快速有效的方式来构建这些列和行向量?提前致谢。

【问题讨论】:

  • 如果不知道您究竟想要非零元素在哪里,就不可能回答这个问题。您的示例向量根本不清楚。
  • 抱歉不清楚。那些非零元素都是 1。
  • 看起来您想创建一个密集的ones 矩阵并将其存储为稀疏矩阵。为什么?
  • 非零元素在哪里,而不是非零元素在哪里。您在向我们询问您的行索引和列索引之间的关系,这基本上可以是任何内容。

标签: matlab indices


【解决方案1】:

我认为这个问题旨在以一种简单的方式创建向量c,r

n = 4;

c = repmat(1:n,1,n-1);
r = reshape(repmat(2:n,n,1),1,[]);

Matrix = sparse(r,c,value,n,n);

这通常会创建您指定的向量。

但是,正如其他人指出的那样,由于开销,完全稀疏矩阵的效率不是很高。如果我没记错的话,如果密度低于 25%,稀疏矩阵会提供优势。拥有除第一行之外的所有内容会导致性能下降。

【讨论】:

  • 感谢您的解决方案。这正是我所需要的。
【解决方案2】:

创建完整版后,您可以sparse 矩阵。

A = (10,10);
A(1,:) = 0;
B = sparse(A);

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 2012-01-10
    • 2012-01-15
    • 2014-05-12
    • 1970-01-01
    • 2017-03-31
    • 2018-01-19
    • 2016-07-29
    相关资源
    最近更新 更多