Связанный список MATLAB

t = timeit.Timer("foo()", "from __main__ import foo")

, Так как timeit не имеет Вашего материала в объеме.

29
задан Deduplicator 16 September 2014 в 11:29
поделиться

6 ответов

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

- Loren

4
ответ дан 28 November 2019 в 01:34
поделиться

Я не думаю, что вы (или я) можете создавать динамические структуры данных в MATLAB. Мы должны использовать функции MATLAB OO и классы MATLAB. Поскольку я думаю, что эти средства на самом деле являются оболочкой MATLAB для Java, я делаю смелое заявление, что эти средства находятся вне MATLAB. Я признаю, что дело в семантике. Если вы хотите создавать динамические структуры данных с помощью MATLAB, вам нужно использовать объектно-ориентированный объект и классы, вы не можете сделать это с помощью того, что я считаю основным языком, в котором отсутствуют указатели на уровне пользователя.

3
ответ дан 28 November 2019 в 01:34
поделиться

Вы можете попробовать моделировать указатели с помощью индексов. Это очень неудобный способ сделать это, но, как вы сказали, Matlab немного необычен и не может создавать «настоящий» связанный список.

Вы можете использовать структуру Matlab, состоящую из двух полей element и далее . элемент будет элементом списка, а next будет индексом следующего узла. Тогда у вас может быть их глобальный массив, представляющий вашу «память». Вы можете определить функцию «malloc», которая добавляет элемент в этот массив и возвращает его индекс. Тогда у вас есть индекс head , который является индексом первого элемента в списке,

2
ответ дан 28 November 2019 в 01:34
поделиться

Ссылка Lulu , предложенная в комментариях, вероятно, является выбором, который я бы сделал, если бы я хотел реализовать связанный список в MATLAB. Однако этот подход отклонился бы от объектно-ориентированных функций MATLAB, что может быть не тем, что вам нужно, поскольку вы упомянули о желании «лучше понять общую структуру языка». Таким образом, вы можете сделать лучше с более простым примером, который включает общие основные функции программирования MATLAB.

Ряд общих функций был упомянут в других ответах, таких как матрицы и индексирование матриц , ] создание структур , и использование вложенных функций и дескрипторов функций . Я рассмотрю пример, в котором используются все эти функции, и , надеюсь, дает хорошее введение в ряд ключевых концепций MATLAB ...

Пример кода:

Сохраните код ниже в файле с именем connected_list.m на пути MATLAB:

function listObject = linked_list(values)

  data = reshape(values,1,[]);
  listObject = struct('display',@display_list,...
                      'addAfter',@add_element,...
                      'delete',@delete_element);

  function display_list
    %# Displays the data in the list
    disp(data);
  end

  function add_element(values,index)
    %# Adds a set of data values after an index in the list, or at the end
    %#   of the list if the index is larger than the number of list elements
    index = min(index,numel(data));
    data = [data(1:index) reshape(values,1,[]) data(index+1:end)];
  end

  function delete_element(index)
    %# Deletes an element at an index in the list
    data(index) = [];
  end

end

Описание:

Функция connected_list принимает матрицу произвольного размера и сначала преобразует ее в вектор-строку, используя функция RESHAPE . Он становится исходным «связанным списком», хранящимся в переменной data .

Затем создается структура (с использованием функции STRUCT ), которая состоит из трех элементов: отобразить , addAfter и удалить . В каждом из этих полей хранится описатель функции одной из трех функций, которые вложены в родительскую функцию connected_list . Эти вложенные функции могут получить доступ к данным переменной , хранящимся в родительской функции.

Структура listObject возвращается из connected_list . Пока эта структура существует в рабочей области, и, следовательно, пока существуют содержащиеся в ней дескрипторы функции, переменная data будет сохраняться даже после возврата из функции connected_list . Затем мы можем вызвать вложенные функции (используя их дескрипторы) для изменения данных переменной . Вот пример ...

Сначала создайте связанный список «объект» и отобразите его содержимое:

>> listObj = linked_list([1 2 3]);  %# A linked list with three elements
>> listObj.display()  %# Access the `display` field and invoke the function
     1     2     3

Затем добавьте элемент «4»

14
ответ дан 28 November 2019 в 01:34
поделиться

MATLAB имеет доступ к Java:

>> a=java.util.LinkedList;
>> li=a.listIterator;
>> li.add(2);
>> li.add(int8(77));
>> li.add(77);
>> li.add(boolean(true));
>> li.add('Mr. Bill');
>> li.previous();
>> li.add([1 2 3 4 5]);
>> a

a =

[2.0, 77, 77.0, true, [D@66a917, Mr. Bill]

>> a.get(4)

ans =

     1
     2
     3
     4
     5

Единственным недостатком этого подхода является то, что MATLAB не имеет способа маршалировать или сериализовать произвольные объекты MATLAB в Java, вы ограничены числа с плавающей запятой, целые числа (необходимо преобразовать их в MATLAB с использованием int8 и т.д.), логические значения, строки, массивы и объекты Java.

24
ответ дан 28 November 2019 в 01:34
поделиться

Создание связанного списка в MATLAB на самом деле не так уж плохо с новой объектно-ориентированной структурой. Я думаю, что большинство людей упускают из виду то, что большая часть поведения указателя может быть достигнута в MATLAB за счет использования «классов дескрипторов».

Итак, начнем с класса Node ...

classdef Node < handle

       properties
           next
           prev
           value
       end

       methods
            function this = Node(inVal)
                this.value = inVal;
            end
       end
 end 

Тогда ваш класс связанного списка будет выглядеть примерно так это ...

classdef LinkedList < handle

           properties
               firstNode
               lastNode
           end

           methods
               function this = LinkedList(newNode)
                   % Initialize LinkedList with newNode
                   this.firstNode = newNode;
                   this.lastNode = newNode;
               end
               function addNode(this,newNode)
                   % Add newNode to the end of the list
                   newNode.prev = this.lastNode;
                   this.lastNode.next = newNode;
                   this.lastNode = newNode;
               end
           end
    end

Я собрал это довольно быстро, поэтому не знаю, будет ли это работать так, как написано. Но если вас просто интересует, как будет выглядеть структура связанного списка MATLAB, я уверен, что этого достаточно, чтобы вы начали.

Ключевой концепцией здесь является суперкласс дескрипторов. Когда вы создаете класс типа handle , вы получаете «указатель» на этот класс.

5
ответ дан 28 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: