0

私は63行x7列のマトリックスを持っています

各列で7、8、9番目の継続的な値をすべて選択し、それらを追加して新しい値を作成したいと思います。

すなわち

789番目が新しい値に追加されました

161718番目が新しい値に追加されました...など

252627日

343536日

434445日

525354日

616263日

したがって、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 に答える