私は63行x7列のマトリックスを持っています
各列で7、8、9番目の継続的な値をすべて選択し、それらを追加して新しい値を作成したいと思います。
すなわち
789番目が新しい値に追加されました
161718番目が新しい値に追加されました...など
252627日
343536日
434445日
525354日
616263日
したがって、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