Повторное добавление нескольких n-х элементов матрицы

У меня есть матрица 63 строки х 7 столбцов

Я хочу выбрать каждое 7-е, 8-е, 9-е текущее значение в каждом столбце и добавить их, чтобы создать новое значение.

i.e.

7 8 9 добавлено к новому значению

16 17 18 добавлено к новому значению... и т.д.

25 26 27th

34 35 36th

43 44 45th

52 53 54th

61 62 63th

Таким образом, я должен получить матрицу 7x7.

Не делая этого вручную, есть ли простая команда, чтобы при изменении размеров матрицы вывод всегда был правильным?


person Tetra    schedule 15.11.2011    source источник


Ответы (3)


Вы можете сделать это легко, немного изменив форму.

originalMatrix = (1:63)'*(1:7); %'
[nRows,nCols] = size(originalMatrix); %# =63 in this example
stepSize = 9;
nTriplets = floor(nRows/stepSize); %# =7 in this example

%# create index list
idx = bsxfun(@minus,stepSize:stepSize:nRows,[2 1 0]'); %'
idx = idx(:); %# reshape to a vector

%# create 3-by-7-by-7 array from original matrix
tmpMatrix = reshape(originalMatrix(idx,:),3,nTriplets,nCols);

%# sum along dim 1 (to sum e.g. the 7th, 8th, and 9th value)
result = squeeze(sum(tmpMatrix,1));

result =
      24          48          72          96         120         144         168
      51         102         153         204         255         306         357
      78         156         234         312         390         468         546
     105         210         315         420         525         630         735
     132         264         396         528         660         792         924
     159         318         477         636         795         954        1113
     186         372         558         744         930        1116        1302
person Jonas    schedule 15.11.2011

matrix=(1:63)'*(1:7);
n=7;

startind = n:(n+2):size(matrix,1);
endind = (n+2):(n+2):size(matrix,1);
tmp=cumsum(matrix);
tmp(endind,:)-tmp(startind,:)

Это, конечно, будет работать только в том случае, если startind и endind имеют одинаковую длину, чего нельзя сказать, скажем, для матрицы размером 62x7.

person arne.b    schedule 15.11.2011

Если бы я правильно понял ваш вопрос, этот фрагмент кода должен делать то, что вы хотите. Но я признаю, что, возможно, это не самый эффективный код Matlab из когда-либо написанных...

k = 9; n = 7; m = k*n; % 63
A = randi(5,m,n);

startIdx = k*(1:n)+n-k;
endIdx = k*(1:n);

B = zeros(n,n);
for i = 1:n
    tmp = A(startIdx(i):endIdx(i),:);
    B(i,:) = sum(tmp,1);
end
person Marek Kurdej    schedule 15.11.2011