ссылка на несколько ячеек

У меня есть массив ячеек, скажем, C. Каждая ячейка содержит матрицу.

Например, скажем, C

C{1}=[1 2;3 4;5 6]
C{2}=[7 8;9 10;11 12]

Как я могу создать новый массив ячеек D, чей элемент i-th представляет собой матрицу, состоящую из i-th транспонированных строк всех матриц в C?

Тогда D должно быть

D{1}=[1 7;2 8]
D{2}=[3 9;4 10]
D{3}=[5 11;6 12]

person Chris    schedule 30.01.2013    source источник
comment
Все ли матрицы в C одного размера?   -  person slayton    schedule 30.01.2013
comment
да, все матрицы в C имеют одинаковый размер.   -  person Chris    schedule 30.01.2013


Ответы (2)


Учитывая, что C всегда имеет указанный вами размер, вы можете попробовать следующее довольно неуклюжее решение:

C{1}=[1 2;3 4;5 6]
C{2}=[7 8;9 10;11 12]


tmp = reshape( [C{:}]', 2,2,3);

D = arrayfun(@(x) squeeze(tmp(:,:,x)), 1:3, 'UniformOutput',  false);

Это приводит к

>> D{:}

ans =

     1     7
     2     8


ans =

     3     9
     4    10


ans =

     5    11
     6    12

Для матриц произвольного размера можно использовать

n = length(C);
[q,p] = size(C{1});

tmp = reshape( [C{:}]', p, n, q);

D = arrayfun(@(x) squeeze(tmp(:,:,x)), 1:n, 'UniformOutput',  false);
person H.Muster    schedule 30.01.2013
comment
Большое тебе спасибо! Это работает отлично, но я не знаю, что мне следует изменить в функциях изменения формы и сжатия, если количество элементов в C равно n, а матрицы в каждой ячейке имеют размер p-by-q. - person Chris; 30.01.2013
comment
@Christos: просто замени 3 на n, а 2 на p и q. Кроме того, вы можете взглянуть на мое решение. - person Jonas; 30.01.2013

Немного менее неуклюжее решение:

C{1}=[1 2;3 4;5 6]
C{2}=[7 8;9 10;11 12]

tmp = cat(3,C{:});
tmp = permute(tmp, [3 2 1]) %# now every slice is of the right form
szTmp = size(tmp);
D = mat2cell(tmp,szTmp(1),szTmp(2),ones(szTmp(3),1)))
person Jonas    schedule 30.01.2013