MATLAB: индексировать массив ячеек с помощью массива ячеек и вернуть массив ячеек - PullRequest
6 голосов
/ 18 марта 2011

Скажем, у меня есть массив ячеек (n X 1) векторов, A, и массив ячеек векторов, содержащих индексы в A, называемые B.Я хочу извлечь массив ячеек, C, такой, что C{i} = [A{B{i}}].
Другими словами, у меня есть массив ячеек массивов индексов, и я хочу извлечь матрицы, соответствующие конкатенациям векторовв A индексируется каждым из этих массивов индексов.

for i = 1:length(B)
    %# B{i} is an array of indices, C{i} is a matrix
    C{i} = [ A{ B{i} } ];
end

Цикл эквивалентен:

C = cellfun(@(x)[A{x}],B,'UniformOutput',false); %# implicit for loop w/ closure

Могу ли я сделать это, используя только индексное выражение?Или, по крайней мере, без цикла?
Я думаю, что deal(), возможно, должен быть вовлечен, но не может понять это.

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Вот два альтернативных решения:

  • Соберите все индексы B вместе с функцией cell2mat, индексируйте содержимое A, чтобы создать одну большую матрицу, затем разделите эту матрицу, используя функцию mat2cell и размеры индексных массивов в B:

    N = size(A{1});                        % Size of an array in A
    M = cellfun('prodofsize', B);          % Array of sizes of elements in B
    C = mat2cell([A{cell2mat(B)}], N, M);
    
  • Вот более компактная версия вашего решения на основе cellfun:

    C = cellfun(@(x) {[A{x}]}, B);
    

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

0 голосов
/ 18 марта 2011

Попробуйте следующее выражение:

C = A(cell2mat(B))

Возможно, вы загляните в блог Лорен о массивах ячеек и их содержимом

...