您的代码中似乎有一些问题。如果我要使用双循环,我会这样做:
M = someNumber;
N = size(big_mat,1); %# I assume big_mat is square here
%# you need different variables for maxCornerCoord and nSubMatrices (your I)
%# otherwise, you are going to index outside the image in the loops!
maxCornerCoord = N-M+1;
nSubMatrices = maxCornerCoord^2;
%# if you want a vector of submatrices, you have to use a cell array...
block_set = cell(nSubMatrices,1);
%# ...or a M-by-M-by-nSubMatrices array...
block_set = zeros(M,M,nSubMatrices);
%# ...or a nSubMatrices-by-M^2 array
block_set = zeros(nSubMatrices,M^2);
for y = 1:maxCornerCoord
for x = 1:maxCornerCoord
index = (y - 1) * maxCornerCoord + x;
%# use this line if block_set is a cell array
block_set{index} = big_mat(x:x+M-1, y:y+M-1);
%# use this line if block_set is a M-by-M-by-nSubMatrices array
block_set(:,:,index) = big_mat(x:x+M-1, y:y+M-1);
%# use this line if block_set is a nSubMatrices-by-M^2 array
block_set(index,:) = reshape(big_mat(x:x+M-1, y:y+M-1),1,M^2);
endfor
endfor
编辑
我刚刚看到有一个用于 Octave的im2col实现。因此,您可以将双循环重写为
%# block_set is a M^2-by-nSubMatrices array
block_set = im2col(big_mat,[M,M],'sliding');
%# if you want, you can reshape the result to a M-by-M-by-nSubMatrices array
block_set = reshape(block_set,M,M,[]);
这可能更快,并且节省了大量的数字树。