我有一个 63 行 x 7 列的矩阵
我想在每列中选择每 7、8、9 个持续值并将它们添加以创建一个新值。
IE
7 8 9th 添加到新值
16 17 18th 添加到新值...等
25 26 27 日
34 35 36 日
43 44 45
52 53 第 54 名
61 62 第 63 名
所以我最终应该得到一个 7x7 矩阵。
如果不手动执行此操作,是否有一个简单的命令,以便如果矩阵的尺寸发生变化,输出将始终正确?
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 的矩阵不会出现这种情况。
如果我正确理解了您的问题,那么这段代码应该可以满足您的要求。但我承认,也许它不是有史以来最高效的 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
你可以通过一些重塑来轻松做到这一点。
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