Matlab: добавление матриц из ячейки по диагонали в новую матрицу нулей - PullRequest
0 голосов
/ 05 октября 2018

У меня есть проблема, которую я пытаюсь решить, которая создает ячейку Nx1, в которой хранящиеся в ней данные всегда представляют собой N чисел матриц 2x2.

Пример:

N = 2
mycell = cell(N,1); 
for i =1:N;
    mycell{i} = randi([0, 10], 2);
end 

newmatrix = zeros (N+1); 

Так, скажем, mycell {1} ​​выглядит так:

[3 5
 2 1]

, а mycell {2} выглядит так:

[6 9;
 3 2]

Моя новая матрица нулей выглядит следующим образом:

[0 0 0
 0 0 0
 0 0 0]

Я хочу, чтобы она тоже выглядела так (объединяя последний элемент первой ячейки с первым элементом следующей ячейки в такой диагонали).setup):

[3 5 0
 2 7 9
 0 3 2]

Существует ли простой способ сделать это или какие-либо встроенные функции Matlab, которые могут помочь?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот решение на основе accumarray.Он не использует циклы и работает для общих размеров N (количество матриц), R (количество строк каждой матрицы) и C (количество столбцов каждой матрицы):

Создание примеров данных (используя обобщение кода в вопросе):

N = 3; % number of matrices
R = 2; % number of rows of each matrix
C = 3; % number of columns of each matrix
mycell = cell(N,1); 
for i =1:N;
    mycell{i} = randi([0, 10], [R C]);
end

Используются следующие шаги:

  1. Построение индексов строк и столбцов с соответствующим разбросом;
  2. Объединить массив ячеек и линеаризовать, чтобы все данные были в векторе-столбце;
  3. Применить accumarray для построения матрицы результатов, суммируя значения с одинаковыми индексами.

Код:

indCol = repmat((0:N-1)*(R-1)+(1:R).', C, 1);
indRow = repelem((0:N-1)*(C-1)+(1:C).', R, 1);
newmatrix = accumarray([indCol(:) indRow(:)], reshape(cat(3, mycell{:}), 1, []));

Пример результата:

>> celldisp(mycell)
mycell{1} =
     3     1     2
     5     6     7
mycell{2} =
     7     4     2
     8     0    10
mycell{3} =
     1     5     0
     9    10     4
>> newmatrix
newmatrix =
     3     1     2     0     0     0     0
     5     6    14     4     2     0     0
     0     0     8     0    11     5     0
     0     0     0     0     9    10     4
0 голосов
/ 05 октября 2018

Мы можем сделать следующее:

N = 2
mycell = cell(N,1); 
newmatrix = zeros (N+1);
for i =1:N;
    mycell{i} = randi([0, 10], 2);
    newmatrix(i:i+1, i:i+1) = newmatrix(i:i+1, i:i+1) + mycell{i}
end 

newmatrix
mycell

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

newmatrix =

    6    4    0
    8   10    9
    0    3    4

mycell =
{
  [1,1] =

     6   4
     8   0

  [2,1] =

     10    9
      3    4

}
...