Повторное добавление нескольких n-х элементов матрицы - PullRequest
0 голосов
/ 15 ноября 2011

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

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

т.е.

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

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

25 26 27-й

34 35 36-й

43 44 45-й

52 53 54-й

61 62 63-й

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

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

Ответы [ 3 ]

1 голос
/ 16 ноября 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
1 голос
/ 16 ноября 2011

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

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
1 голос
/ 15 ноября 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.

...