Отображение функции на массив разреженных матриц в Юлии - PullRequest
0 голосов
/ 24 марта 2019

У меня есть массив 1000-element Array{SparseMatrixCSC{Float64,Int64},1} разреженных матриц в Julia с именем A, который содержит 1000 разреженных матриц.Я использовал команду sparse пакета SparseArrays Джулии, чтобы сохранить каждую разреженную матрицу массива.Я представляю выдержку ниже:

julia> A
1000-element Array{SparseMatrixCSC{Float64,Int64},1}:

  [1   ,    1]  =  0.994372
  [2   ,    1]  =  0.991773
  [3   ,    1]  =  0.992271
  [4   ,    1]  =  0.998889
  [5   ,    1]  =  0.992853
  [6   ,    1]  =  0.998921
  [7   ,    1]  =  0.98486
  [8   ,    1]  =  0.988783
  [9   ,    1]  =  0.995152
  ⋮
  [1492,   42]  =  0.955595
  [1493,   42]  =  0.982923
  [1494,   42]  =  0.951944
  [1495,   42]  =  1.0
  [1496,   42]  =  0.975999
  [1497,   42]  =  0.954872
  [1498,   42]  =  0.963355
  [1499,   42]  =  0.925815
  [1500,   42]  =  0.93627

  [1   ,    1]  =  0.975476
  [2   ,    1]  =  0.977395
  [3   ,    1]  =  0.996842
  [4   ,    1]  =  0.996767
  [5   ,    1]  =  0.998007
  [6   ,    1]  =  0.996788
  [7   ,    1]  =  0.959937
  [8   ,    1]  =  0.996806
  [9   ,    1]  =  0.97679
  ⋮
  [1492,   42]  =  0.991332
  [1493,   42]  =  0.999623
  [1494,   42]  =  0.982065
  [1495,   42]  =  0.984356
  [1496,   42]  =  0.998067
  [1497,   42]  =  0.987055
  [1498,   42]  =  0.995269
  [1499,   42]  =  0.977139
  [1500,   42]  =  0.98173
  ....

Я хочу применить следующую функцию к A:

map(function maxkernLY(x) map(y->y[2],mapslices(findmax, x, dims=2)) end,A)

Функция принимает каждую матрицу массива и для каждой строкиВыбранная матрица ищет максимальное значение.Когда A составлен из плотных матриц, функция работает отлично, но когда A составлен из разреженных матриц как выше, я получаю следующую ошибку:

MethodError: no method matching zero(::Type{Tuple{Float64,Int64}})

Любой намек?Может быть любой Массив разреженных матриц, даже массив из 2 маленьких разреженных матриц, необязательно приведенный выше пример.

1 Ответ

1 голос
/ 25 марта 2019

Делает ли это:

getindex.(findmax.(A, dims=2), 2)

дать тебе то, что ты хочешь? (небольшое отличие от вашего кода в том, что он возвращает индексы во всех массивах, а не в строках, но это может быть просто исправлено, если вам это не нравится; на практике с этими двойными индексами будет еще проще работать позже).

Относительно вашего исходного кода - похоже, это ошибка в Джулии. Что подтверждается, когда вы читаете определение setindex! вокруг строки 2677 в \ SparseArrays \ src \ sparsematrix.jl.

EDIT

Если вы хотите использовать mapslices, вы можете использовать что-то вроде этого:

map(x -> mapslices(t -> collect(findmax(t)), x, dims=2)[:, 2], A)

или

getindex.(mapslices.(t -> collect(findmax(t)), A, dims=2), :, 2)

это даст вам эквивалентный исходный код.

...