poster
2019-12-10, 20:41
我有一个很大的矩阵,我想从中收集子矩阵的集合。如果我的矩阵是NxN,子矩阵大小是MxM,我想收集I=(N - M + 1)^2个子矩阵。换句话说,我想为原始矩阵中的每个元素提供一个MxM子矩阵,该子矩阵可以位于此类矩阵的左上角。
这是我的代码:
for y = 1:I for x = 1:I index = (y - 1) * I + x; block_set(index) = big_mat(x:x+M-1, y:y+M-1) endfor endfor 如果a)错误,并且b)暗示big_mat(x:x+M-1, y:y+M-1)表达式中有某些内容,则可以得到我想要的内容,而无需两个for循环。任何帮助将非常感激
回答:
您的代码中似乎有些错误。如果我要使用双循环,这是我要怎么做:
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 编辑
我刚刚看到Oct2 (http://octave.sourceforge.net/image/function/im2col.html)有一个im2col (http://octave.sourceforge.net/image/function/im2col.html)实现。因此,您可以将双循环重写为
%# 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,[]); 这可能更快,并且可以节省大量的数字树。
更多&回答... (https://stackoverflow.com/questions/2716610)
这是我的代码:
for y = 1:I for x = 1:I index = (y - 1) * I + x; block_set(index) = big_mat(x:x+M-1, y:y+M-1) endfor endfor 如果a)错误,并且b)暗示big_mat(x:x+M-1, y:y+M-1)表达式中有某些内容,则可以得到我想要的内容,而无需两个for循环。任何帮助将非常感激
回答:
您的代码中似乎有些错误。如果我要使用双循环,这是我要怎么做:
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 编辑
我刚刚看到Oct2 (http://octave.sourceforge.net/image/function/im2col.html)有一个im2col (http://octave.sourceforge.net/image/function/im2col.html)实现。因此,您可以将双循环重写为
%# 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,[]); 这可能更快,并且可以节省大量的数字树。
更多&回答... (https://stackoverflow.com/questions/2716610)