Есть ли в Matlab оператор сплат (или его эквивалент)? - PullRequest
10 голосов
/ 11 января 2012

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

Контекст: у меня есть список индексов для n -d массива, Q.Я хочу что-то вроде Q(a,b,:), но у меня есть только [a,b].Поскольку я не знаю n, я не могу просто жестко закодировать индексирование.

1 Ответ

10 голосов
/ 11 января 2012

В MATLAB нет оператора, который бы это делал.Однако, если ваши индексы (например, bar в вашем примере) были сохранены в массиве ячеек , то вы можете сделать это:

bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

{:} создает разделенный запятыми список из массива ячеек.Это, вероятно, самая близкая вещь, которую вы можете получить к форме «оператора», которую вы имеете в своем примере, кроме переопределения одного из существующих операторов (показано здесь и здесь ) чтобы он генерировал разделенный запятыми список из стандартного массива или создавал свой собственный класс для хранения ваших индексов и определял, как для него работают существующие операторы (ни один вариант для слабонервных!).

Для вашего конкретного примера индексации произвольного массива ND вы также можете вычислить линейный индекс по индексам подписки, используя функцию sub2ind (подробности здесь и здесь), но в конечном итоге вы могли бы выполнить больше работы, чем в моем решении с разделенными запятыми списками выше.Другой альтернативой является , вычисляющий линейный индекс самостоятельно , который обойдется , преобразуя в массив ячеек и используя только матричные / векторные операции.Вот пример:

% Precompute these somewhere:
scale = cumprod(size(Q)).';  %'
scale = [1; scale(1:end-1)];
shift = [0 ones(1, ndims(Q)-1)];

% Then compute a linear index like this:
indices = [3 4 5];
linearIndex = (indices-shift)*scale;
Q(linearIndex)  % Equivalent to Q(3,4,5)
...