2015-03-27 8 views
2

Есть ли какая-либо простая команда/код для суммирования подматриц блока в диагонали охватывающей матрицы? Пример:Матрицы суммирования по диагонали - MatLab

А = [А11 А12; А21 А22]

Я хотел бы получить A11 + A22, где МОС NxK матриц блоков.

Спасибо.

+0

сообщение некоторые примеры входных данных? Если это блоки «NxK», каков размер A? – Divakar

+0

Вы всегда хотите получить сумму двух блоков, так что A 2Nx2K? – Daniel

+0

Да, A 2Nx2K. – user191919

ответ

1

Учитывая

  • D как число диагональных матриц
  • Н и К в качестве параметров размера каждого блока

Перечисленного код следующим будет общий код для достижения целей, поставленных в проблема -

start_block = bsxfun(@plus,[1:N]',[0:K-1]*D*N)  %//'# Starting block indices 
blks = A(bsxfun(@plus,start_block(:),[0:D-1]*(D*N*K + N)))%// Blocks in columns 
out = reshape(sum(blks,2),N,K) %// Sum blks across columns and reshape into a 
           %// N x K array for the final output 

Sample работать с D = 4, N = 4 & K = 3 -

A = 
    6  9  9  2  7  6  2  9  1  1  4  2 
    4  5  5  3  7  4  9  8  8  6  6  2 
    3  3  7  1  6  9  3  7  9  9  7  3 
    5  7  2  9  4  3  9  8  1  4  6  7 
    4  7  9  6  4  6  3  4  9  4  5  8 
    4  7  5  9  8  6  4  6  1  9  6  7 
    6  7  7  2  3  4  1  6  7  9  5  1 
    7  1  1  9  8  2  6  5  8  7  1  8 
    4  7  8  8  8  1  2  3  5  9  7  9 
    4  5  7  6  8  4  1  3  8  7  9  7 
    2  2  2  4  5  2  7  5  9  4  4  1 
    1  1  5  3  6  7  4  3  6  6  9  4 
    3  8  3  7  9  4  6  8  2  3  4  7 
    3  2  5  3  4  8  4  9  2  3  8  7 
    6  2  4  1  1  7  6  1  2  7  5  3 
    9  6  4  7  8  6  1  5  1  5  4  3 
blks = 
    6  6  2  3 
    4  9  1  3 
    3  2  7  7 
    5  9  4  5 
    9  4  3  4 
    5  8  3  8 
    3  3  5  5 
    7  8  3  4 
    9  6  5  7 
    5  6  8  7 
    7  4  9  3 
    2  2  6  3 
out = 
    17 20 27 
    17 24 26 
    19 16 23 
    23 22 13 

Проверьте выход образца перспективе -

>> A(1:4,1:3) + A(5:8,4:6) + A(9:12,7:9) + A(13:16,10:12) 
ans = 
    17 20 27 
    17 24 26 
    19 16 23 
    23 22 13 
2

Это просто некоторая матрица индексация:

N=size(A,1)/2; 
K=size(A,2)/2; 
E=A(1:N,1:K)+A(N+1:end,K+1:end) 

Я рекомендую прочитать документацию страниц о матричной индексации и операторе colon.

+0

Есть ли однострочный для матрицы произвольного размера (все блок-подматрицы с одинаковым размером). – user191919

+0

@ user191919: Для обобщенной версии проверьте ссылку thewaywewalk, предоставленную вам. – Daniel

Смежные вопросы