В Matlab я могу получить доступ к элементу массива, который, в свою очередь, является значением контейнера. Карта? - PullRequest
5 голосов
/ 20 февраля 2012

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

a = [1, 2];
m = containers.Map('KeyType','char', 'ValueType','any');
m('stackoverflow.com') = a;
pull_the_first_element_of_the_stored_array = m('stackoverflow.com')(1);
??? Error: ()-indexing must appear last in an index expression.

Как получить доступ к элементу массива, который, в свою очередь, является значением объекта карты? Я мог бы сделать это:

temp = m('stackoverflow.com');
pull_the_first_element_of_the_stored_array = temp(1);

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

РЕДАКТИРОВАТЬ: Это дубликат Как я могу индексировать массив MATLAB, возвращаемый функцией без предварительного присвоения его локальной переменной? Ответ есть.

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Это еще один случай, когда вы можете обойти синтаксические ограничения с помощью небольших вспомогательных функций.Например:

getFirst = @(x)x(1);

pull_the_first_element_of_the_stored_array = getFirst(m('stackoverflow.com'));

Для этого по-прежнему нужны две строки, но вы часто можете повторно использовать определение функции.В целом, вы можете написать:

getNth = @(x, n) x(n);

, а затем использовать:

getNth (m('stackoverflow.com'),1);
1 голос
/ 22 февраля 2012

Хотя этот вопрос является дубликатом этого предыдущего вопроса , я вынужден указать на одну небольшую разницу между проблемами, которые они решают, и тем, как мой предыдущий ответ может быть адаптирован немного ...

Предыдущий вопрос касался того, как обойти проблему синтаксиса, связанную с немедленным вызовом функции, за которой следует операция индексирования в той же строке. Вместо этого этот вопрос касается двух операций индексации, следующих сразу за одной и той же строкой. Два решения из моего другого ответа (с использованием SUBSREF или вспомогательной функции) также применимы, но на самом деле существует альтернативный способ использования SUBSREF, который объединяет две операции индексации, например:

value = subsref(m,struct('type','()','subs',{'stackoverflow.com',{1}}));

Обратите внимание, как индексы последовательного индекса 'stackoverflow.com' и 1 объединяются в массив ячеек для создания структурного массива 1 на 2 для передачи в SUBSREF. Это все еще уродливый однострочник, и я бы все еще выступал за использование решения с временными переменными для удобства чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...