2011-01-21 2 views
1

Я пытаюсь найти уравнение для математического определения «сплющенного индекса» массива из «сложного индекса». Обратите внимание на следующий пример в Ruby.Узнайте «сплющенный индекс» из «уложенного индекса» массива

matx = [[[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8]], 

     [[ 9,10,11,12], 
     [13,14,15,16]]] 

В этом примере matx представляет собой трехмерную матрицу, а элемент 7 расположен в matx[0][1][2]. Однако, в следующем примере:

matx.flatten! # => [1, 2, 3, 4, 5, 6, 7, 8, 
       #  9, 10, 11, 12, 13, 14, 15, 16] 

Теперь элемент 7 расположен в matx[6].

По существу, я ищу способ, учитывая размеры матрицы и набор индексов для конкретного элемента, преобразовать из уложенной в матрицу матрицу. Обратный также был бы потрясающим, но я полагаю, что это похоже на то, что похоже (но по существу наоборот) на метод получения этого результата. Я понял, что обратная функция на самом деле не является функцией, потому что нет никакого способа сказать разницу относительно того, 5 карт ли [2,3] или [3,2] и т. Д. Поэтому я не буду смотреть на это один.

ответ

2
class Index 
    def initialize *dims 
    @dims = dims.reverse 
    end 

    def if_flat *subs 
    raise unless @dims && @dims.size == subs.size 
    res = 0 
    subs.reverse.each_with_index { |s, i| res += s * @dims[0...i].inject(1) { |m, e| m * e }} 
    res 
    end 
end 
puts Index.new(2, 2, 4).if_flat 0, 1, 2 
+0

Это отлично работает. Единственное, что путают, - это a) почему вы отменили его? и б) что такое бит с инъекцией, который на самом деле делает? – ashays

+0

После немного дополнительной проверки я понимаю, что это по сути то же самое, что и .reduce (: *) '. Спасибо за помощь снова! :) – ashays

+1

Ну, я хотел, чтобы он работал с любым количеством измерений, поэтому мне пришлось найти общее решение. Выражение 'inject' просто возвращает 1 или 1 столбец x или 1 x столбцов x строк и т. Д. Он вычисляет число, на котором будет умножаться каждый индекс, т. Е. Кумулятивный размер объектов, индексируемых индексом. Поскольку первый индекс индексирует произведение размеров остальных индексов, было удобно обрабатывать как размеры, так и нижние индексы справа налево, отсюда и «обратная». – DigitalRoss