我有一个矩阵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矩阵。
如果不手动操作,是否有一个简单的命令,这样如果矩阵的尺寸发生变化,输出将始终是正确的?
答案 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,:)
当然,只有当startind
和endind
具有相同的长度时才会起作用,例如,大小为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