2017-02-13 2 views
2

Позвольте A быть матрицей (m x j*m), A1=A(1:m,1:m) и A2=A(1:m,(m+1):2*m) и так далее.Суммирующий векторный блок матриц в MATLAB

Что бы мог быть простой код для вычисления A1+...+Aj для некоторого целого числа j>1.

Благодаря

+0

Что произойдет, если 'm' и' n' будут нечетными числами? – codeaviator

+0

Проверьте изменения. Должно быть ясно. – hipHopMetropolisHastings

+0

Как определить «A3»? 'А3 = А (1: м, (2 * М + 1): 3 * м)'? – codeaviator

ответ

3

Один из способов сделать это может быть reshape матрица в 3D, так что каждый блок представляет собой срез, а затем просуммировать по третьему измерению:

B = reshape(A, m, m, []); 
out = sum(B, 3); 

... или в одном линии, если не хотите использовать временную переменную:

out = sum(reshape(A, m, m, []), 3); 

reshape принимает столбцы вашей матрицы и укладывает их, чтобы гарантировать, что выход видоизмененных Int o правильные размеры, которые вы хотите. Поэтому мы хотим, чтобы строки m и m, а третье измерение оставлено динамическим или пустым [], чтобы мы могли определить, сколько секций требуется нам автоматически. Технически это должно быть j, но мы позволим MATLAB понять это самостоятельно. Этот измененный результат даст вам 3D-матрицу, где каждый фрагмент является блоком. m Столбцы, которые являются m строк длинными, и у нас есть j из них. Осталось суммировать все блоки, которые суммируются по третьему измерению.

Вот краткий пример, чтобы убедиться, что у нас это право. Предположим, что m = 6 и j = 3. Я собираюсь создать матрицу, которая собирается быть 6 x 18 в этом случае:

>> m = 6; 
>> j = 3; 
>> A = reshape(1 : (m*(j*m)), m, []) 

>> A 

A = 

    1  7 13 19 25 31 37 43 49 55 61 67 73 79 85 91 97 103 
    2  8 14 20 26 32 38 44 50 56 62 68 74 80 86 92 98 104 
    3  9 15 21 27 33 39 45 51 57 63 69 75 81 87 93 99 105 
    4 10 16 22 28 34 40 46 52 58 64 70 76 82 88 94 100 106 
    5 11 17 23 29 35 41 47 53 59 65 71 77 83 89 95 101 107 
    6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108 

Использование reshape дает, таким образом 3D-матрицу с 3 ломтиков, и мы должны быть в состоянии сегмента из блоков красиво на срез:

>> B = reshape(A, m, m, []) 

B(:,:,1) = 

    1  7 13 19 25 31 
    2  8 14 20 26 32 
    3  9 15 21 27 33 
    4 10 16 22 28 34 
    5 11 17 23 29 35 
    6 12 18 24 30 36 


B(:,:,2) = 

    37 43 49 55 61 67 
    38 44 50 56 62 68 
    39 45 51 57 63 69 
    40 46 52 58 64 70 
    41 47 53 59 65 71 
    42 48 54 60 66 72 


B(:,:,3) = 

    73 79 85 91 97 103 
    74 80 86 92 98 104 
    75 81 87 93 99 105 
    76 82 88 94 100 106 
    77 83 89 95 101 107 
    78 84 90 96 102 108 

Наконец, поскольку каждый блок в срезе в этой 3D-матрицы, просто просуммировать по третьему измерению:

>> out = sum(B, 3) 

out = 

    111 129 147 165 183 201 
    114 132 150 168 186 204 
    117 135 153 171 189 207 
    120 138 156 174 192 210 
    123 141 159 177 195 213 
    126 144 162 180 198 216 

Мы можем убедиться, что это правильно как первая строка, первый столбец вывода представляет собой сумму 1 + 37 + 73 = 111. Аналогично, первая строка, вторая колонка равна 7 + 43 + 79 = 129. Вы можете выполнить аналогичные проверки с остальной частью вывода для проверки правильности результата. Очевидно, что вы должны убедиться, что размеры вашей матрицы совместимы, чтобы сделать это изменение или возникнет ошибка.

+0

Ницца ... спасибо за прием! Я действительно собирался проверить это, чтобы убедиться, что это сработало. Я думаю, это было так: P – rayryeng

+1

Очень хороший ответ! Мне все нравится. – codeaviator

+1

Убил его! В хорошем смысле. – hipHopMetropolisHastings

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