MATLAB: использование cellfun с многоуровневым массивом ячеек - PullRequest
0 голосов
/ 17 мая 2018

У меня есть многоуровневый массив ячеек.Индивидуальные уровни могут быть разных размеров.Мне интересно, как я могу применить cellfun на самом низком уровне.Представьте себе следующий многоуровневый массив ячеек:

a = {randi(10,5,1), randi(5,5,1)}
b = randi(100,5,1,10)
f = {a,b}

Теперь я бы хотел развернуть как можно больше и применить cellfun до самого глубокого возможного уровня f.На каждом уровне находится 2D / 3D матрица.Допустим, я просто хочу добавить 5 к каждому значению.Какой самый эффективный способ?

Вот результат, который я ищу.

[a_nRows, a_nCols, a_nPages] = size(a)
x = cellfun(@plus, f{1}, repmat({5}, a_nRows, a_nCols, a_nPages), 'UniformOutput', false)
y = cellfun(@plus, f(2), {5}, 'UniformOutput', false)

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете использовать рекурсию для этого.

Во-первых, определите функцию, которая выполняет одно из двух действий

  1. Если вход представляет собой числовую матрицу, примените некоторую операцию.
  2. Если вход является ячейкой, вызовите эту же функцию с содержимым ячейки в качестве ввода.

Функция будет выглядеть примерно так (определяется локально для другой функции или в ее собственном файле m):

function out = myfunc( in, op )
    if iscell( in )
        out = cellfun( @(x) myfunc(x, op), in, 'UniformOutput', false );
    elseif isnumeric( in )
        out = op( in );
    else
        error( 'Cell contents must be numeric or cell!' )
    end
end

Тогда вы можете позвонить myfunc на свой мобильный. Вот пример, похожий на ваш:

a = {[1 2; 3 4], {eye(2), 10}}; % Nested cell arrays with numeric contents
op = @(M) M + 5;                % Some operation to apply to all numeric contents

myfunc( a, op )
% >> ans = 
%     { [6 7; 8 9], {[6 5; 5 6], 15}}

Непосредственно по вашему примеру, вывод myfunc(f, @(M)M+5) совпадает с вашим {x, y{1}} - то есть операция op применяется к каждой ячейке и вложенной ячейке с результатом, структурированным так же, как и вход.

...