2015-10-08 4 views
2

Учитывая список столбцов и строк, я хочу создать подматрицу холесной факторизации. Пример:Создайте подматрицу UpperTriangularMatrix в Julia

julia> A = rand(10,10) 
julia> R = chol(A'*A) 
julia> ind = [1,3,6,8,9] 
julia> R[ind,ind] 

Однако это приводит к ошибке:

ERROR: BoundsError: attempt to access 5x5 
UpperTriangular{Float64,Array{Float64,2}}: 
1.28259 0.0   0.0 0.0 0.0 
0.0  6.51646e-314 0.0 0.0 0.0 
0.0  0.0   0.0 0.0 0.0 
0.0  0.0   0.0 0.0 0.0 
0.0  0.0   0.0 0.0 0.0 
at index [2,1] 
in _unsafe_getindex at multidimensional.jl:197 
in getindex at abstractarray.jl:483 

Я понимаю, что это будет работать для типичной матрицы, но UpperTriangular типа, очевидно, требует что-то другое ... Я не могу найти документацию по этому вопросу.

ответ

5

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

Легкие пути вокруг этого для теперь преобразование в полный массив перед вами индекс:

julia> full(R)[ind,ind] 
5x5 Array{Float64,2}: 
2.2261 1.28096 1.69087 1.26135 1.50703 
0.0  1.03681 0.115735 0.559855 0.70766 
0.0  0.0  0.702936 -0.111155 -0.61263 
0.0  0.0  0.0  0.661491 0.33661 
0.0  0.0  0.0  0.0  0.159691 

Или с помощью подмассив, который создает вид в исходные данные (так изменения будут распространяться):

julia> sub(R, ind, ind) 
5x5 SubArray{Float64,2,UpperTriangular{Float64,Array{Float64,2}},Tuple{Array{Int64,1},Array{Int64,1}},0}: 
2.2261 1.28096 1.69087 1.26135 1.50703 
0.0  1.03681 0.115735 0.559855 0.70766 
0.0  0.0  0.702936 -0.111155 -0.61263 
0.0  0.0  0.0  0.661491 0.33661 
0.0  0.0  0.0  0.0  0.159691 
+1

Так что я бы сделал 'UpperTriangular (full (R) [ind, ind])', если я планирую использовать подматрицу для дальнейших вычислений? Это кажется неэффективным (на практике у меня есть большая матрица 'R') ... –

+1

Типы треугольников - это просто обертки вокруг полных матриц. Они просто говорят Джулии игнорировать все элементы выше или ниже диагонали. Повторная упаковка результата не копирует базовые данные, поэтому на самом деле все это неэффективно. –

+0

Ницца! Это хорошо знать. Может быть, мне стоит изучить это как разреженную верхнюю треугольную матрицу, тогда ... Я предположил, что нижние диагональные нули не были сохранены в памяти по умолчанию. –

Смежные вопросы