Nano Hash - криптовалюты, майнинг, программирование

Итерация для `setindex!`

У меня есть несколько специально определенных массивов в Джулии, которые вы можете считать просто композицией многих массивов. Например:

type CompositeArray{T}
  x::Vector{T}
  y::Vector{T}
end

со схемой индексации

getindex(c::CompositeArray,i::Int) = i <= length(c) ? c.x[i] : c.y[i-length(c.x)]

У меня есть одно предостережение: более высокая схема индексации просто переходит к самому x:

getindex(c::CompositeArray,i::Int...) = c.x[i...]

Теперь итератор через них можно легко сделать как цепочку итератора на x и затем на y. Это делает перебор значений почти без дополнительных затрат. Однако можно ли сделать что-то подобное для итерации до setindex!?

Я думал о том, чтобы создать отдельную диспетчеризацию для CartesianIndex{2} только для индексации x против y и индекса, и создать для этого итератор eachindex, аналогичный тому, что CatViews.jl делает. Однако я не уверен, как это будет взаимодействовать с отправкой i... и будет ли это полезно в данном случае.

Кроме того, будет ли вещание автоматически использовать эту схему быстрой итерации, если оно построено на eachindex?

Редактирует:

length(c::CompositeArray) = length(c.x) + length(c.y)

В реальном случае x может быть любым AbstractArray (и, следовательно, имеет линейный индекс), но поскольку используется только линейная индексация (за исключением этой одной пользовательской функции getindex), проблема на самом деле сводится к выяснению того, как это сделать. это с x вектором.

14.02.2017

  • Каково определение length(c) и, учитывая естественное определение, что происходит, когда вы getindex(c,i) когда i>length(c.x)+length(c.y) ? Кроме того, c.x[i...] является странным, поскольку c.x является вектором, т.е. имеет размерность 1. Не могли бы вы уточнить вопрос. 14.02.2017
  • О, была ошибка в индексации. Исправлена. 14.02.2017

Ответы:


1

Заставлять X[CartesianIndex(2,1)] означать что-то отличное от X[2,1], конечно, плохо кончится. И подобных неприятностей я ожидал бы от того, что X[100,1] может означать что-то отличное от X[100] или если length(X) != prod(size(X)). Вы можете нарушать правила, но не удивляйтесь, если функции в Base и других пакетах ожидают, что вы им будете следовать.

Безопасным способом сделать это было бы заставить eachindex(::CompositeArray) возвращать пользовательский итератор по объектам, которые вы полностью контролируете. Может быть, просто бросить обертку и перенаправить методы в CartesianRange и CartesianIndex{2}, если эта структура данных полезна. Затем, когда вы получаете один из этих настраиваемых типов индексов, вы знаете, что SplitIndex(CartesianIndex(1,2)) действительно намеревается ссылаться на первый элемент во втором массиве.

14.02.2017
  • Ага, понятно. Безопасным способом сделать это было бы заставить eachindex(::CompositeArray) возвращать пользовательский итератор по объектам, которыми вы полностью управляете. Под этим вы подразумеваете создание неизменяемого и нового getindex для этого типа и использование его в eachindex? Похоже, это сработает. 14.02.2017
  • Ага, точно. - 14.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..