2013-11-14 1 views
2

У меня есть функция, которая может работать с матрицами или массивами ячеек. Чтобы получить базовые элементы, мне нужно получить доступ к элементам матриц, например v(i), и к элементам массивов ячеек, например v{i}. Если я получаю доступ к массиву ячеек, например v(i), я получу элемент, содержащий ячейку 1x1, вместо самого элемента.Доступ к унифицированному элементу для матриц "v (i)" и массивы ячеек "v {i}"

Есть ли единый способ доступа к элементам как в матрицах, так и в ячеистых массивах? На данный момент я должен использовать рукописную функцию для этого:

function elem = get_element(array, i) 
    if iscell(array) 
    elem = array{i}; 
    else 
    elem = array(i); 
    end 
end 

Примечание: производительность не является проблемой.

+0

... ну, если * производительность * не является проблемой ... <потирает руки вместе и бросает зловещую улыбку> –

+0

Собственно Ваше решение не выглядит так плохо. Но не хотите ли вы получить доступ к 'array (2,2)' например? –

+0

Доступ к ней осуществляется путем последовательной индексации. Я повторяю от 1 до 'numel (array)' – Mikhail

ответ

2

Почему бы не преобразовать все входы в массивы ячеек, а затем использовать только {} доступ?

function myFunctionThatGetsMatAndCell(inp) 
if ~iscell(inp) 
    inp = num2cell(inp); 
end 
% continue here with only {} access... 
%... 
+0

В качестве бонуса он также работает со строками. –

2

Или, наоборот:

function myFunctionThatGetsMatAndCell(inp) 
    if iscell(inp) 
     inp = [inp{:}]; end 

    % continue here with only() access... 
    %... 
+0

Что произойдет, если некоторые элементы 'inp' не могут быть преобразованы в скаляры? что, если 'inp' имеет строковые ячейки? Я думал, что было бы безопаснее «бросать» на «ячейку», поскольку это более общая структура данных ... – Shai

+0

@Shai: действительно, в этих случаях вы получите ошибки. ОП пытается обрабатывать два типа данных, как если бы они были одинаковыми, это просто вызывает проблемы. Кажется, он пытается сделать что-то, где гарантируется, что эти условия для ячейки верны. Если это не так, мое решение [не работает быстрее] (http://en.wikipedia.org/wiki/Fail-fast), чем ваше. –

+0

Спасибо за другое предложение! Тем не менее, я в основном работаю с массивами ячеек с содержимым, не конвертируемым в скаляры, а иногда с матрицами. Поэтому ответ Шай - это то, что мне нужно. – Mikhail

Смежные вопросы