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