2016-06-24 10 views

Antwort

3

Sie können für Matrizen mit Julias regulären Verkettungsfunktionen tun dies, z.B.

julia> a = sparse([1,2],[1,2],[1,1]) 
2x2 sparse matrix with 2 Int64 entries: 
    [1, 1] = 1 
    [2, 2] = 1 

julia> b = sparse([0 0]) 
1x2 sparse matrix with 0 Int64 entries: 

julia> c = sparse([0 ; 0 ; 1]) 
3x1 sparse matrix with 1 Int64 entries: 
    [3, 1] = 1 

julia> d = [[a ; b] c] 
3x3 sparse matrix with 3 Int64 entries: 
    [1, 1] = 1 
    [2, 2] = 1 
    [3, 3] = 1 

julia> full(d) 
3x3 Array{Int64,2}: 
1 0 0 
0 1 0 
0 0 1 
+1

vielen dank! genau was ich brauchte – isebarn

1

Ein anderer „Schurkenstaaten“ (aber schneller) Weg, um die gleichen Ergebnisse zu erhalten, ist durch die folgende Funktion definieren:

function Base.resize!{T,D}(sp::SparseMatrixCSC{T,D},m,n) 
    newcolptr = sp.colptr 
    resize!(newcolptr,n+1) 
    for i=sp.n+2:n+1 
    newcolptr[i] = sp.colptr[sp.n+1] 
    end 
    return SparseMatrixCSC(m,n,newcolptr,sp.rowval,sp.nzval) 
end 

Um die Funktion für das Problem im OP zu verwenden:

a = sparse([1,2],[1,2],[1,1]) 
a = resize!(a,3,3) 
a[3,3] = 1 

Diese Lösung ist "Rogue", weil sie nicht wirklich a ändert, aber vergisst a und bindet es an eine neue spärliche Matrix. Dies ist notwendig, da dünn besetzte Matrizen unveränderlich sind. Wenn Sie sowohl a als auch den Rückgabewert resize! behalten, werden sich beide Puffer im Speicher teilen und es können schlimme Dinge passieren. Auf der positiven Seite sollte es sehr schnell sein und das obige Anwendungsbeispiel birgt keine Gefahren.

P.S. Vielleicht ist die Überladung resize! nicht die beste Idee.

Verwandte Themen