Выбор произвольных строк из матрицы Neo в Nim? - PullRequest
0 голосов
/ 15 марта 2019

Я использую библиотеку Neo для линейной алгебры в Nim, и я хотел бы извлечь произвольные строки из матрицы.

Я могу явно выбрать непрерывную последовательность строк в соответствии с примерами в README, но не могу выбрать непересекающееся подмножество строк.

import neo

let x = randomMatrix(10, 4)
let some_rows = @[1,3,5]

echo x[2..4, All]  # works fine
echo x[some_rows, All] ## error

1 Ответ

0 голосов
/ 16 марта 2019

Первый echo работает, потому что вы создаете объект Slice , для которого neo определил процедуру. Второй echo использует последовательность целых чисел, и этот тип доступа не определен в библиотеке neo. К сожалению, срезы определяют непрерывные закрытые диапазоны, вы даже не можете указать от шагов до итерации с большим шагом, чем единица, поэтому нет способа выполнить то, что вы хотите.

Глядя на структуру матрицы, кажется, что она сильно оптимизирована, чтобы избежать копирования данных. Матричные операции преобразования, кажется, повторно используют данные предыдущей матрицы и изменяют доступ / размеры. Таким образом, матричное преобразование с произвольной случайностью было бы невозможно, индексы в вашем примере специально обращаются к данным, не являющимся непрерывными, и это должно быть как-то закодировано в новой структуре. Плюс, если бы вы написали @[1,5,3], это нарушило бы любой тип итеративного цикла.

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

...