Заполнить верхнюю треугольную матрицу из списка


Я ищу хороший способ, чтобы заполнить элементы нижней треугольной матрицы из списка.

В настоящее время у меня есть это:

PadRight[#, s] & /@ 
 Prepend[Take[elems, # + {1, 0}] & /@ 
   Partition[Accumulate[Range[0, s - 1]], 2, 1], {}]

где элемс - это элементы списка и с - ее длина.

Возможно, лучший способ-это предварительное выделение плюс четкий, процессуальные делать-петли. Что вы думаете?

Вы можете проверить выше с:

s = 5
elems = Range[s(s-1)/2]


1134
2
задан 11 октября 2011 в 04:10 Источник Поделиться
Комментарии
1 ответ

Вот несколько способов для рассмотрения и обратной связи.


Это один использует ядро моего "динамического раздела" функции. Это самый быстрый способ я знаю эту проблему. Также, возможно, рефакторинг, как этот код делает ее более понятной.

dynP[l_, p_] := 
MapThread[l[[# ;; #2]] &, {{0}~Join~Most@# + 1, #} &@Accumulate@p]

#~PadRight~s & /@ {{}} ~Join~ dynP[elems, Range[s-1]]


Это немного короче, используя различные способы построения индексов, но и немного медленнее, и, возможно, менее прозрачный.

#~PadRight~s & /@ 
Prepend[
elems~Take~# & /@
Array[{1 + # (# - 1)/2, # (# + 1)/2} &, s - 1],
{}
]


Это немногословный, но медленно. Удобочитаемость является спорным.

SparseArray[Join @@ Table[{i, j}, {i, s}, {j, i - 1}] -> elems, s] // MatrixForm


Вот я только что придумал, и я вполне доволен. Я думаю, что это может быть более понятным, чем большинство из тех, что выше.

Take[FoldList[RotateLeft, elems, Range[0, s - 1]] ~LowerTriangularize~ -1, All, s + 1]

3
ответ дан 17 октября 2011 в 08:10 Источник Поделиться