Позвольте A
быть матрицей (m x j*m)
, A1=A(1:m,1:m)
и A2=A(1:m,(m+1):2*m)
и так далее.Суммирующий векторный блок матриц в MATLAB
Что бы мог быть простой код для вычисления A1+...+Aj
для некоторого целого числа j>1
.
Благодаря
Позвольте A
быть матрицей (m x j*m)
, A1=A(1:m,1:m)
и A2=A(1:m,(m+1):2*m)
и так далее.Суммирующий векторный блок матриц в MATLAB
Что бы мог быть простой код для вычисления A1+...+Aj
для некоторого целого числа j>1
.
Благодаря
Один из способов сделать это может быть 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. Вы можете выполнить аналогичные проверки с остальной частью вывода для проверки правильности результата. Очевидно, что вы должны убедиться, что размеры вашей матрицы совместимы, чтобы сделать это изменение или возникнет ошибка.
Ницца ... спасибо за прием! Я действительно собирался проверить это, чтобы убедиться, что это сработало. Я думаю, это было так: P – rayryeng
Очень хороший ответ! Мне все нравится. – codeaviator
Убил его! В хорошем смысле. – hipHopMetropolisHastings
Что произойдет, если 'm' и' n' будут нечетными числами? – codeaviator
Проверьте изменения. Должно быть ясно. – hipHopMetropolisHastings
Как определить «A3»? 'А3 = А (1: м, (2 * М + 1): 3 * м)'? – codeaviator