用于创建稀疏矩阵的矩阵索引

时间:2015-11-24 15:04:15

标签: matlab indices

我想创建一个4乘4的稀疏矩阵A.我想为以下条目赋值(例如1):

// jqplot adding integersOnly option for an axis
var oldCreateTicks = $.jqplot.LinearAxisRenderer.prototype.createTicks;
$.jqplot.LinearAxisRenderer.prototype.createTicks = function (plot) {
    if (this.integersOnly == true) {
        var db = this._dataBounds;
        var min = ((this.min != null) ? this.min : db.min);
        var max = ((this.max != null) ? this.max : db.max);
        var range = max - min;
        if (range < 3) {
            if (this.min == null) {
                this.min = 0;
            }
            this.tickInterval = 1;
        }
    }
    return oldCreateTicks.apply(this, plot);
}

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

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)

另外,对于列索引

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

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

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

然后,我的稀疏矩阵将是

value = ones(1,length(r))

我的问题是:

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

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

对于行向量,它将是

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

我想问一下,是否有一种快速的方法可以有效地构建这些列和行向量?提前谢谢。

2 个答案:

答案 0 :(得分:3)

我认为这个问题旨在以简单的方式创建向量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%,稀疏矩阵可以提供优势。拥有除第一行之外的所有内容都会导致性能降低。

答案 1 :(得分:0)

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

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