2016-12-01 4 views
0

Я хотел бы знать, можно ли инвертировать порядок вложенных массивов ячеек в Matlab.Инвертировать порядок вложенных массивов ячеек в Matlab

Если у меня есть массив ячеек A{a,b}{c,d} есть способ, чтобы преобразовать его в B{c,d}{a,b} ?

Цель состоит в том, чтобы получить C={c,d}(a,b) , чтобы иметь возможность суммировать сумму свыше a.

Если я C=cellfun(@cell2mat, A, 'UniformOutput', false); тогда C будет иметь форму C{a,b}(c,d), которая не поможет мне в дальнейшем.

Я был бы признателен за любую помощь, советы и комментарии.

Анна

ответ

0

Не совсем уверен, если ваш A Название переменной имеет номера или даже больше вложенных клеток в A{a,b}{c,d} уровне, но если мы предположим одного номера в ячейке вы могли бы сделать это в 2 коротких шагов

  1. Свести вашу клетку
  2. Built его в переставить порядок

Давайте сначала создадим несколько тестовых данных. Чтобы упростить проверку кода, каждое значение строится по информации об исходном положении/индексе по шаблону: ab.cd. Например, A{1,4}{2,3} присваивается значение 14.23.

% Index size 
a = 5; 
b = 4; 
c = 3; 
d = 2; 

% Cell values 
[ai, bi] = ind2sub([a b], 1:a*b); 
abVal = 10*ai + bi; 
[ci,di] = ndgrid(1:c,1:d); 
cdVal = ci/10+di/100; 

% Built up A 
A = cell(a,b); 
for i = 1:numel(A) 
    A{i} = num2cell(abVal(i) + cdVal); 
end 

The num2cell действительно не нужен здесь, но там лучше имитировать ваши данные. Если у вас есть число (не ячейки) или более глубокие вложенные ячейки, возможно, вам придется использовать круглые скобки (:) вместо фигурных скобок {:} в последней строке ниже. Но для этого примера это делается.

% Flatten the 2-level nested cell (could use vercat instead of horcat) 
A_flat = horzcat(A{:}); 
A_flat = horzcat(A_flat{:}); % Could also use [A_flat{:}] here 

Теперь использует тот факт, что значения размещаются на одинаковом расстоянии указательного и выбрать из EVERE c x b значение.

% Built up re-arrange cell 
A_reOrdered = cell(c,d); 
for i = 1:c*d 
    A_reOrdered{i} = reshape(A_flat(i:c*d:end), a, b); 
end 

Вот, я на самом деле превратился из A{a,b}{c,d} в A{c,d}(a,b). Если вы хотите ячеистую структуру в нижней части, т.е. A{c,d}{a,b}, просто положить num2cell перед reshape в for петле

Для некоторого примера Valus:

>> A_reOrdered{3,1} 
ans = 
     11.31  12.31  13.31  14.31 
     21.31  22.31  23.31  24.31 
     31.31  32.31  33.31  34.31 
     41.31  42.31  43.31  44.31 
     51.31  52.31  53.31  54.31 

>> A_reOrdered{3,1}(5,2) 
ans = 
     52.31 

, который первоначально был помещен в

>> A{5,2}{3,1} 
ans = 
     52.31 

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

Например, чтобы подвести все значения для определенного 'B'

nB = a*c*d; 
for ib = 1:b 
    bSum(ib) = sum(A_flat((ib-1)*nB + (1:nB))); 
end 

% ... or without the for-loop 
bSum = arrayfun(@(x) sum(A_flat(x + (1:nB))), nB*(0:b-1)); 

bSum = 
     936.45  966.45  996.45  1026.5 
Смежные вопросы