0

我有一个 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 矩阵。

如果不手动执行此操作,是否有一个简单的命令,以便如果矩阵的尺寸发生变化,输出将始终正确?

4

3 回答 3

1
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,:)

当然,这仅适用于长度相同的情况startindendind例如,大小为 62x7 的矩阵不会出现这种情况。

于 2011-11-15T19:37:52.457 回答
1

如果我正确理解了您的问题,那么这段代码应该可以满足您的要求。但我承认,也许它不是有史以来最高效的 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
于 2011-11-15T20:12:44.593 回答
1

你可以通过一些重塑来轻松做到这一点。

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
于 2011-11-15T20:14:05.130 回答