2011-11-15 65 views
0

我有一个基63行×7列添加多个第n个元素反复

我要选择每7日,8日,9日在正在进行的每个列的值,并添加他们创造新的价值。

7 8第九添加到新的值

16 17 18加入到一个新的值...等

25 26 27日

52 53 54th

61 62 63th

所以我应该以7x7矩阵结束。

没有这样做手动,是否有一个简单的命令,以便如果矩阵的尺寸变化,输出将始终是正确的?

+0

哪个尺寸会改变? – Jacob

回答

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 
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

如果我已经正确理解你的问题,这段代码应该做你想做的事。但我承认,也许这不是最高效的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