t = timeit.Timer("foo()", "from __main__ import foo")
, Так как timeit не имеет Вашего материала в объеме.
Вы можете реализовать связанный список с дескриптором функции для вложенной функции, которая хранит данные связанного списка в рабочей области вложенного родителя.
- Loren
Я не думаю, что вы (или я) можете создавать динамические структуры данных в MATLAB. Мы должны использовать функции MATLAB OO и классы MATLAB. Поскольку я думаю, что эти средства на самом деле являются оболочкой MATLAB для Java, я делаю смелое заявление, что эти средства находятся вне MATLAB. Я признаю, что дело в семантике. Если вы хотите создавать динамические структуры данных с помощью MATLAB, вам нужно использовать объектно-ориентированный объект и классы, вы не можете сделать это с помощью того, что я считаю основным языком, в котором отсутствуют указатели на уровне пользователя.
Вы можете попробовать моделировать указатели с помощью индексов. Это очень неудобный способ сделать это, но, как вы сказали, Matlab немного необычен и не может создавать «настоящий» связанный список.
Вы можете использовать структуру Matlab, состоящую из двух полей element
и далее
. элемент
будет элементом списка, а next
будет индексом следующего узла. Тогда у вас может быть их глобальный массив, представляющий вашу «память». Вы можете определить функцию «malloc», которая добавляет элемент в этот массив и возвращает его индекс. Тогда у вас есть индекс head
, который является индексом первого элемента в списке,
Ссылка 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»
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.
Создание связанного списка в 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
, вы получаете «указатель» на этот класс.