@@ -1312,36 +1312,34 @@ function findnz(S::SparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
1312
1312
return (I, J, V)
1313
1313
end
1314
1314
1315
- function _sparse_findnextnz (m:: SparseMatrixCSC , i:: Integer )
1316
- if i > length (m)
1317
- return nothing
1318
- end
1319
- row, col = Tuple (CartesianIndices (m)[i])
1315
+ function _sparse_findnextnz (m:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1316
+ row, col = Tuple (ij)
1317
+ col > m. n && return nothing
1318
+
1320
1319
lo, hi = m. colptr[col], m. colptr[col+ 1 ]
1321
1320
n = searchsortedfirst (m. rowval, row, lo, hi- 1 , Base. Order. Forward)
1322
1321
if lo <= n <= hi- 1
1323
- return LinearIndices (m)[m . rowval[n], col]
1322
+ return CartesianIndex (m . rowval[n], col)
1324
1323
end
1325
- nextcol = findnext (c -> (c > hi), m. colptr, col+ 1 )
1326
- nextcol === nothing && return nothing
1324
+ nextcol = searchsortedfirst ( m. colptr, hi + 1 , col + 1 , length (m . colptr), Base . Order . Forward )
1325
+ nextcol > length (m . colptr) && return nothing
1327
1326
nextlo = m. colptr[nextcol- 1 ]
1328
- return LinearIndices (m)[m . rowval[nextlo], nextcol- 1 ]
1327
+ return CartesianIndex (m . rowval[nextlo], nextcol - 1 )
1329
1328
end
1330
1329
1331
- function _sparse_findprevnz (m:: SparseMatrixCSC , i:: Integer )
1332
- if iszero (i)
1333
- return nothing
1334
- end
1335
- row, col = Tuple (CartesianIndices (m)[i])
1330
+ function _sparse_findprevnz (m:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1331
+ row, col = Tuple (ij)
1332
+ iszero (col) && return nothing
1333
+
1336
1334
lo, hi = m. colptr[col], m. colptr[col+ 1 ]
1337
1335
n = searchsortedlast (m. rowval, row, lo, hi- 1 , Base. Order. Forward)
1338
1336
if lo <= n <= hi- 1
1339
- return LinearIndices (m)[m . rowval[n], col]
1337
+ return CartesianIndex (m . rowval[n], col)
1340
1338
end
1341
- prevcol = findprev (c -> (c < lo), m. colptr, col- 1 )
1342
- prevcol === nothing && return nothing
1339
+ prevcol = searchsortedlast ( m. colptr, lo - 1 , 1 , col - 1 , Base . Order . Forward )
1340
+ prevcol < 1 && return nothing
1343
1341
prevhi = m. colptr[prevcol+ 1 ]
1344
- return LinearIndices (m)[m . rowval[prevhi- 1 ], prevcol]
1342
+ return CartesianIndex (m . rowval[prevhi- 1 ], prevcol)
1345
1343
end
1346
1344
1347
1345
@@ -1361,77 +1359,6 @@ function sparse_sortedlinearindices!(I::Vector{Ti}, V::Vector, m::Int, n::Int) w
1361
1359
return SparseMatrixCSC (m, n, colptr, I, V)
1362
1360
end
1363
1361
1364
- # findfirst/next/prev/last
1365
- function _idxfirstnz (A:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1366
- nzr = nzrange (A, ij[2 ])
1367
- searchk = searchsortedfirst (A. rowval, ij[1 ], first (nzr), last (nzr), Forward)
1368
- return _idxnextnz (A, searchk)
1369
- end
1370
-
1371
- function _idxlastnz (A:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1372
- nzr = nzrange (A, ij[2 ])
1373
- searchk = searchsortedlast (A. rowval, ij[1 ], first (nzr), last (nzr), Forward)
1374
- return _idxprevnz (A, searchk)
1375
- end
1376
-
1377
- function _idxnextnz (A:: SparseMatrixCSC , idx:: Integer )
1378
- nnza = nnz (A)
1379
- nzval = nonzeros (A)
1380
- z = zero (eltype (A))
1381
- while idx <= nnza
1382
- nzv = nzval[idx]
1383
- ! isequal (nzv, z) && return idx, nzv
1384
- idx += 1
1385
- end
1386
- return zero (idx), z
1387
- end
1388
-
1389
- function _idxprevnz (A:: SparseMatrixCSC , idx:: Integer )
1390
- nzval = nonzeros (A)
1391
- z = zero (eltype (A))
1392
- while idx > 0
1393
- nzv = nzval[idx]
1394
- ! isequal (nzv, z) && return idx, nzv
1395
- idx -= 1
1396
- end
1397
- return zero (idx), z
1398
- end
1399
-
1400
- function _idx_to_cartesian (A:: SparseMatrixCSC , idx:: Integer )
1401
- rowval = rowvals (A)
1402
- i = rowval[idx]
1403
- j = searchsortedlast (A. colptr, idx, 1 , size (A, 2 ), Base. Order. Forward)
1404
- return CartesianIndex (i, j)
1405
- end
1406
-
1407
- function Base. findnext (pred:: Function , A:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1408
- if nnz (A) == length (A) || pred (zero (eltype (A)))
1409
- return invoke (findnext, Tuple{Function,Any,Any}, pred, A, ij)
1410
- end
1411
- idx, nzv = _idxfirstnz (A, ij)
1412
- while idx > 0
1413
- if pred (nzv)
1414
- return _idx_to_cartesian (A, idx)
1415
- end
1416
- idx, nzv = _idxnextnz (A, idx + 1 )
1417
- end
1418
- return nothing
1419
- end
1420
-
1421
- function Base. findprev (pred:: Function , A:: SparseMatrixCSC , ij:: CartesianIndex{2} )
1422
- if nnz (A) == length (A) || pred (zero (eltype (A)))
1423
- return invoke (findprev, Tuple{Function,Any,Any}, pred, A, ij)
1424
- end
1425
- idx, nzv = _idxlastnz (A, ij)
1426
- while idx > 0
1427
- if pred (nzv)
1428
- return _idx_to_cartesian (A, idx)
1429
- end
1430
- idx, nzv = _idxprevnz (A, idx - 1 )
1431
- end
1432
- return nothing
1433
- end
1434
-
1435
1362
"""
1436
1363
sprand([rng],[type],m,[n],p::AbstractFloat,[rfn])
1437
1364
0 commit comments