Как суммировать столбцы матрицы за указанное количество столбцов? - PullRequest
1 голос
/ 17 января 2020

У меня есть матрица A размера 2500 x 500. Я хочу суммировать каждые 10 столбцов и получить результат в виде матрицы B размера 2500 x 50. То есть первый столбец B - это сумма первых 10 столбцов A, второй столбец B - сумма вторых 10 столбцов A и т. Д.

Как я могу это сделать без for l oop? Так как я должен делать это сотни раз, и это занимает очень много времени, используя для l oop.

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Сначала мы «преобразуем блок» A, чтобы у нас было необходимое количество столбцов. Поэтому мы бесстыдно крадем код у великого Дивакара и прилагаем минимальные усилия для его обобщения. Затем нам просто нужно суммировать по второй оси и изменить ее на исходную форму.

Вот пример с пятью столбцами, которые нужно суммировать:

% Sample input data
A = reshape(1:100, 10, 10).'
[r, c] = size(A);

% Number of columns to be summed
n_cols = 5;

% Block reshape to n_cols, see https://stackoverflow.com/a/40508999/11089932
B = reshape(permute(reshape(A, r, n_cols, []), [1, 3, 2]), [], n_cols);

% Sum along second axis
B = sum(B, 2);

% Reshape to original form
B = reshape(B, r, c / n_cols)

Вот результат:

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

B =
    15    40
    65    90
   115   140
   165   190
   215   240
   265   290
   315   340
   365   390
   415   440
   465   490

Надеюсь, это поможет!

1 голос
/ 17 января 2020

Это можно сделать с помощью splitapply. Преимущество этого подхода в том, что он работает , даже если размер группы не делит количество столбцов (последняя группа меньше):

A = reshape(1:120, 12, 10).'; % example 10×12 data (borrowed from HansHirse)
n_cols = 5; % number of columns to sum over
result = splitapply(@(x)sum(x,2), A, ceil((1:size(A,2))/n_cols));

В этом примере

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

result =
    15    40    23
    75   100    47
   135   160    71
   195   220    95
   255   280   119
   315   340   143
   375   400   167
   435   460   191
   495   520   215
   555   580   239
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...