Как искать и манипулировать разреженными матрицами в Julia - PullRequest
1 голос
/ 05 мая 2020

У меня большая разреженная матрица. Я хотел бы иметь возможность делать две вещи:

  1. Найти строку, в которой есть только одно ненулевое значение. Назовем его индекс строки idx.
  2. Обнуляемый столбец idx, найденный в 1. Я хотел бы сделать это эффективно, поскольку матрица большая.

У меня есть пробовал читать https://docs.julialang.org/en/v1/stdlib/SparseArrays/, но я не вижу, как это сделать.

1 Ответ

4 голосов
/ 05 мая 2020

Если я правильно вас понял, это должно работать:

julia> using SparseArrays

# Dummy data
julia> A = sparse([1, 1, 2, 2, 3, 3], [1, 2, 3, 1, 2, 3], [2, 3, 0, 0, 0, 5])
3×3 SparseMatrixCSC{Int64,Int64} with 6 stored entries:
  [1, 1]  =  2
  [2, 1]  =  0
  [1, 2]  =  3
  [3, 2]  =  0
  [2, 3]  =  0
  [3, 3]  =  5

# Count non-zero elements across rows
julia> using StatsBase

julia> valcounts = countmap(A.rowval[A.nzval .!= 0])
Dict{Int64,Int64} with 2 entries:
  3 => 1
  1 => 2

# Find the row(s) with only one non-zero element
julia> [k for k ∈ keys(valcounts) if valcounts[k] == 1]
1-element Array{Int64,1}:
 3

# Set the non-zero element in the third row to zero
julia> A[3, A[3, :] .> 0] .= 0
1-element view(::SparseMatrixCSC{Int64,Int64}, 3, [3]) with eltype Int64:
 0

julia> A
3×3 SparseMatrixCSC{Int64,Int64} with 6 stored entries:
  [1, 1]  =  2
  [2, 1]  =  0
  [1, 2]  =  3
  [3, 2]  =  0
  [2, 3]  =  0
  [3, 3]  =  0
...