# Generating a matrix with specific sums

1 view (last 30 days)
Hylke Dijkstra on 2 Jan 2022
Commented: Image Analyst on 3 Jan 2022
Dear all,
I am trying to generate a matrix based on specific sums. Let's say I generate the following matrix
X = randi([0 400], 6, 6);
Which gives me the matrix X. Now I want to sum x11 and x21, x12 and x22, x21 and x22, and so on. This should give me a 3x6 matrix. Does anyone have any clue how to do this effectively?
Best
Hylke Dijkstra on 2 Jan 2022
Yes, it is! I wrote this reply before I noticed you helped out, thanks!

Image Analyst on 2 Jan 2022
The pattern is confusing, like Torsten says. Is this what you mean?
X = randi([0 400], 6, 6)
X = 6×6
395 191 150 346 373 27 235 335 369 34 49 224 158 234 266 205 264 328 382 31 302 279 44 131 86 393 156 130 331 188 260 137 229 312 185 345
X2 = [...
sum(X(1:2, :), 1); ...
sum(X(3:4, :), 1); ...
sum(X(5:6, :), 1); ]
X2 = 3×6
630 526 519 380 422 251 540 265 568 484 308 459 346 530 385 442 516 533
Image Analyst on 3 Jan 2022
If you have some other even number of rows, you can use a for loop:
X = randi([0 400], 8, 3)
X = 8×3
350 342 147 234 99 127 16 366 80 136 333 267 227 281 388 127 313 179 313 213 244 207 62 4
[rows, columns] = size(X);
X2 = zeros(rows/2, columns);
newRow = 1;
for row = 1 : 2 : rows
X2(newRow, :) = sum(X(row : row+1, :), 1);
newRow = newRow + 1; % Increment pointer
end
X2 % Show in command window.
X2 = 4×3
584 441 274 152 699 347 354 594 567 520 275 248

Paul on 2 Jan 2022
Another solution:
X = randi([0 400], 6, 6)
X = 6×6
201 154 330 38 350 3 65 77 370 157 11 316 97 86 189 251 231 29 233 238 74 4 248 64 374 336 400 168 244 26 377 339 53 90 291 364
kron(eye(3),[1 1])*X
ans = 3×6
266 231 700 195 361 319 330 324 263 255 479 93 751 675 453 258 535 390
Paul on 3 Jan 2022
Mathematically, all that's happening is matrix multiplication. Is that the part of the solution you're asking about?
FWIW, this solution probably isn't the most efficient what with all the multiplications by zero and summing up terms that are zero. Probably better to just pre-allocate the answer and use a simple loop over the sum() function (basically a minor extension of Image Analyst's solution) to fill in the rows of the anwer.