@@ -19,6 +19,10 @@ function SparseMatrixCSC(Tv::Type, m::Int, n::Int, numnz::Integer)
19
19
SparseMatrixCSC {Tv,Ti} (m, n, colptr, rowval, nzval)
20
20
end
21
21
22
+ function SparseMatrixCSC (m:: Int32 , n:: Int32 , colptr, rowval, nzval)
23
+ return SparseMatrixCSC (int (m), int (n), colptr, rowval, nzval)
24
+ end
25
+
22
26
issparse (A:: AbstractArray ) = false
23
27
issparse (S:: SparseMatrixCSC ) = true
24
28
@@ -140,21 +144,19 @@ full{T}(S::SparseMatrixCSC{T}) = convert(Matrix{T}, S)
140
144
141
145
function sparse (A:: Matrix )
142
146
m, n = size (A)
143
- I, J, V = findn_nzs (A)
144
- _jl_sparse ( int32 (I), int32 (J), V, m, n )
147
+ ( I, J, V) = findn_nzs (A)
148
+ return _jl_sparse_sorted! (I,J,V,m,n, + )
145
149
end
146
150
147
- # _jl_sparse_sortbased uses sort to rearrange the input and construct the sparse matrix
151
+ # _jl_sparse_sort uses sort to rearrange the input and construct the sparse matrix
148
152
149
- _jl_sparse_sortbased (I,J,V) = _jl_sparse_sortbased (I, J, V, int (max (I)), int (max (J)), + )
153
+ _jl_sparse_sort (I,J,V) = _jl_sparse_sort (I, J, V, int (max (I)), int (max (J)), + )
150
154
151
- _jl_sparse_sortbased (I,J,V,m,n) = _jl_sparse_sortbased (I, J, V, m, n, + )
155
+ _jl_sparse_sort (I,J,V,m,n) = _jl_sparse_sort (I, J, V, m, n, + )
152
156
153
- _jl_sparse_sortbased (I,J,V,m,n,combine) = _jl_sparse_sortbased (I, J, V, m, n, combine)
154
-
155
- function _jl_sparse_sortbased {Ti<:Union(Int32,Int64)} (I:: AbstractVector{Ti} , J:: AbstractVector{Ti} ,
156
- V:: Union(Number, AbstractVector) ,
157
- m:: Int , n:: Int , combine:: Function )
157
+ function _jl_sparse_sort {Ti<:Union(Int32,Int64)} (I:: AbstractVector{Ti} , J:: AbstractVector{Ti} ,
158
+ V:: Union(Number, AbstractVector) ,
159
+ m:: Int , n:: Int , combine:: Function )
158
160
159
161
if length (I) == 0 ; return spzeros (eltype (V),m,n); end
160
162
@@ -184,6 +186,15 @@ function _jl_sparse_sortbased{Ti<:Union(Int32,Int64)}(I::AbstractVector{Ti}, J::
184
186
185
187
if isa (V, Number); V = fill (V, length (I)); end
186
188
189
+ return _jl_sparse_sorted! (I,J,V,m,n,combine)
190
+ end
191
+
192
+ _jl_sparse_sorted! (I,J,V,m,n) = _jl_sparse_sorted! (I,J,V,m,n,+ )
193
+
194
+ function _jl_sparse_sorted! {Ti<:Union(Int32,Int64)} (I:: AbstractVector{Ti} , J:: AbstractVector{Ti} ,
195
+ V:: AbstractVector ,
196
+ m:: Int , n:: Int , combine:: Function )
197
+
187
198
cols = zeros (Ti, n+ 1 )
188
199
cols[1 ] = 1 # For cumsum purposes
189
200
cols[J[1 ] + 1 ] = 1
@@ -330,8 +341,37 @@ function sparse{Tv,Ti<:Union(Int32,Int64)}(I::AbstractVector{Ti}, J::AbstractVec
330
341
return SparseMatrixCSC (nrow, ncol, RpT, RiT, RxT)
331
342
end
332
343
344
+ function find (S:: SparseMatrixCSC )
345
+ sz = size (S)
346
+ I, J = findn (S)
347
+ return sub2ind (sz, I, J)
348
+ end
349
+
350
+ function findn {Tv,Ti} (S:: SparseMatrixCSC{Tv,Ti} )
351
+ numnz = nnz (S)
352
+ I = Array (Ti, numnz)
353
+ J = Array (Ti, numnz)
354
+
355
+ count = 1
356
+ for col = 1 : S. n, k = S. colptr[col] : (S. colptr[col+ 1 ]- 1 )
357
+ if S. nzval[k] != 0
358
+ I[count] = S. rowval[k]
359
+ J[count] = col
360
+ count += 1
361
+ else
362
+ println (" Warning: sparse matrix contains explicit stored zeros." )
363
+ end
364
+ end
365
+
366
+ if numnz != count- 1
367
+ I = I[1 : count]
368
+ J = J[1 : count]
369
+ end
370
+
371
+ return (I, J)
372
+ end
333
373
334
- function find {Tv,Ti} (S:: SparseMatrixCSC{Tv,Ti} )
374
+ function findn_nzs {Tv,Ti} (S:: SparseMatrixCSC{Tv,Ti} )
335
375
numnz = nnz (S)
336
376
I = Array (Ti, numnz)
337
377
J = Array (Ti, numnz)
@@ -345,7 +385,7 @@ function find{Tv,Ti}(S::SparseMatrixCSC{Tv,Ti})
345
385
V[count] = S. nzval[k]
346
386
count += 1
347
387
else
348
- println (" Warning: sparse matrix has explicit stored zeros." )
388
+ println (" Warning: sparse matrix contains explicit stored zeros." )
349
389
end
350
390
end
351
391
@@ -388,8 +428,8 @@ speye(m::Int, n::Int) = speye(Float64, m, n)
388
428
389
429
function speye (T:: Type , m:: Int , n:: Int )
390
430
x = int32 (min (m,n))
391
- rowval = linspace ( int32 (1 ), x, x)
392
- colptr = [rowval, int32 (x+ 1 )* ones (Int32, n+ 1 - x)]
431
+ rowval = [ int32 (1 ): x]
432
+ colptr = [rowval, int32 (( x+ 1 )* ones (Int32, n+ 1 - x) )]
393
433
nzval = ones (T, x)
394
434
return SparseMatrixCSC (m, n, colptr, rowval, nzval)
395
435
end
0 commit comments