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

Я пытаюсь реализовать алгоритм Брукса-Айенгара для объединения датчиков и пытаюсь представить следующую структуру данных в MATLAB.

A = {([1.5,3.2],4), ([0,2.7],5), ([0.8,2.8],4)}

Я пытался сделать следующее

B = {{[1.5,3.2],4},{[0,2.7],5}}

Но тогда я не знаю, как получить доступ к каждому элементу, т.е. 1.5, 3.2 и 4 а также следующий набор значений. Я получаю один набор элементов из B{1}, но я не могу получить отдельные значения после.

Любые идеи или указатели на соответствующие ссылки будут полезны.

3 ответа

Решение

С текущей структурой вы можете просто продолжить индексирование:

>> B{1}

ans = 

    [1x2 double]    [4]

>> B{1}{1}

ans =

    1.5000    3.2000

>> B{1}{1}(2)

ans =

    3.2000

>> B{1}{2}

ans =

     4

Чтобы удалить элемент из основной структуры, вы можете использовать следующий синтаксис B(1) = [];:

>> B = {{[1.5,3.2],4},{[0,2.7],5}}

B = 

    {1x2 cell}    {1x2 cell}

>> B(1) = []

B = 

    {1x2 cell}

>> B{1}

ans = 

    [1x2 double]    [5]

>> 

Вы также можете выбрать представление данных в структурном массиве (с некоторым лучшим именованием свойств):

>> s = struct('prop1',{4, 5},'prop2', {[1.5,3.2], [0,2.7]})

s = 

1x2 struct array with fields:

    prop1
    prop2

>> s(1).prop1

ans =

     4

>> s(1).prop2

ans =

    1.5000    3.2000

>> s(1).prop2(2)

ans =

    3.2000

Чтобы удалить элемент, вы можете использовать аналогичный синтаксис:

s(1) = []

Если вы хотите выполнить некоторые операции с элементами данных, вы также можете выбрать подход ООП и создать класс, который представляет отдельный элемент данных и, необязательно, класс, представляющий весь набор данных. Доступ к данным членов является естественным.

Если ваша версия MATLAB достаточно новая (т.е. >= R2013b), вы можете использовать table за это:

A = table([1.5,3.2; 0,2.7; 0.8,2.8],[4; 5; 4],'VariableNames',{'name1','name2'});

Как видите, результат легко проверить (визуально) и легко получить:

A.name1(3,2) % is 2.8000

Если вы не можете использовать клетки, то я бы начал с cell2mat и посмотрим, поможет ли это.

  vals = cell2mat(B{2}) % returns the array vals=[0 2.7 5]

Вы также можете просто использовать ваши данные как обычную матрицу с самого начала:

 B = [ 1.5, 3.2, 4; 0, 2.7, 5];

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

редактировать: я думаю, DVarga дает более подробный и полезный ответ.

Другие вопросы по тегам