重复添加矩阵的多个第n个元素

时间:2011-11-15 19:08:25

标签: matlab matrix addition

我有一个矩阵63行x 7列

我想在每列中选择每个第7,第8,第9个持续值并添加它们以创建新值。

7 8 9th添加了新值

16 17 18th增加了一个新值...等等

25 26 27th

34 35 36th

43 44 45th

52 53 54th

61 62 63th

所以我最终应该使用7x7矩阵。

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

3 个答案:

答案 0 :(得分: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的矩阵就不会这样。

答案 1 :(得分: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

答案 2 :(得分: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