【问题标题】:Get matrix consisting of every subsquare获取由每个子方组成的矩阵
【发布时间】:2019-01-09 14:06:49
【问题描述】:

我希望获得一个矩阵,该矩阵由矩阵中的每个 3x3 方格组成。矩阵是一个#channels x m x n。最终结果是一个大小为#channels x (size1-2)*(size2-2) x 9的矩阵,我可以通过以下代码以非向量方式执行此操作:

clear
size1 = 10;
size2 = 10;
matrix = 1:size1*size2;
matrix =reshape(matrix,[size1 size2]);
matrix_withdraw = 1:(88*size1*size2);
matrix_withdraw = reshape(matrix_withdraw,[88 size1 size2]);
tic
iter = 1;
for ii = 1:size1-2
    for jj = 1:size2-2
        locs(ii,jj,:,:) = matrix(ii:ii+2,jj:jj+2);
        method1(:,iter,:) = reshape(matrix_withdraw(:,ii:ii+2,jj:jj+2),[88,9]);
        iter = iter+1;
    end
end
locs = permute(locs,[3 4 1 2]);

对于大尺寸的矩阵,这显然相当慢。我正在寻找矢量化这个。我设法获得了一个可行但不是很干净的解决方案

locs2 = ones(size1*(size2-2),1)+(0:size1*(size2-2)-1)';
temp = 1:size1*(size2-2);
temp = mod(temp,size1);
temp = (temp>(size1-2)) | (temp==0);
locs2(temp,:) = [];
locs3 = reshape(locs2,[1 1 (size1-2) (size2-2)]);
locs3(2,1,:,:) = reshape(locs2+1,[1 1 (size1-2) (size2-2)]);
locs3(3,1,:,:) = reshape(locs2+2,[1 1 (size1-2) (size2-2)]);
locs3(:,2,:,:) = locs3(:,1,:,:)+size1;
locs3(:,3,:,:) = locs3(:,2,:,:)+size1;
locs3 = permute(locs3,[1 2 4 3]);
locs3 = vec(locs3);
method2 = matrix_withdraw(:,locs3);
method2 = reshape(method2,[88,9,64]);
method2 = permute(method2,[1 3 2]);

Method1 和 method2 是等效的,并且呈现完全相同的结果。方法 2 也比方法 1 快 10 倍。我的问题是,有没有更清洁的方法来做到这一点?

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    如果您有图像处理工具箱,您可以使用im2col 将每个块作为一列,然后将reshape 作为一个 4-D 数组:

    blockSize = [3 3];
    locs = reshape(im2col(matrix, blockSize), [blockSize size(matrix)-blockSize+1]);
    

    或者您可以直接使用implicit singleton expansion 构建一个 4-D 索引数组。这不需要任何工具箱:

    m = 3; n = 3; % block size
    [M, N] = size(matrix);
    ind = (1:m).'+(0:n-1)*M + reshape(0:M-m, 1, 1, []) + reshape((0:N-n)*M, 1, 1, 1, []);
    locs = matrix(ind);
    

    【讨论】:

    • 比我的方法慢一点,但更简洁和可扩展。
    • 我正在研究另一种方法。你有什么 Matlab 版本?
    • 2018b,我也有GPU
    • 每次我认为我擅长编程时,我都会遇到一个表明我真的知之甚少的人,哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2017-02-13
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多