如何在不使用Matlab进行复制的情况下提取子矩阵

时间:2016-08-21 01:41:46

标签: matlab matrix

我有一个大矩阵,我需要从一个滑动窗口中提取一个小矩阵,该矩阵在整个大矩阵上运行,但在操作过程中,提取矩阵的内容不会改变,所以我会这样做喜欢在不创建新副本的情况下提取子矩阵,而只是像C指针一样指向大矩阵的一部分。我怎样才能做到这一点?请帮帮我,非常感谢你:)

2 个答案:

答案 0 :(得分:0)

我做了一些基准测试来测试如果不使用显式临时矩阵更快,而且可能不是:

function move_mean(N)
M = randi(100,N);
window_size = [50 50];
dir_time = timeit(@() direct(M,window_size))
tmp_time = timeit(@() with_tmp(M,window_size))
end

function direct(M,window_size)
m = zeros(size(M)./2);
for r = 1:size(M,1)-window_size(1)
    for c = 1:size(M,2)-window_size(2)
        m(r,c) = mean(mean(M(r:r+window_size(1),c:c+window_size(2))));
    end
end
end

function with_tmp(M,window_size)
m = zeros(size(M)./2);
for r = 1:size(M,1)-window_size(1)
    for c = 1:size(M,2)-window_size(2)
        tmp = M(r:r+window_size(1),c:c+window_size(2));
        m(r,c) = mean(mean(tmp));
    end
end
end

表示大小为100 * 100的M

dir_time =
      0.22739
tmp_time =
      0.22339

因此,使用临时变量似乎只会让您的代码可读,而不是更慢。

答案 1 :(得分:0)

在这个答案中,我描述了什么是最好的'解决方案一般。对于这个答案,我定义了最好的'最具可读性而没有显着的性能损失。 (现有答案部分显示)。

基本上你可能有两种情况。

1。您多次使用子矩阵

在这种情况下,最佳解决方案通常是创建一个包含子矩阵的临时变量。

A = M(rmin:rmax, cmin:cmax)

可能存在各种方法(定义一个函数/匿名函数,为你索引矩阵),但总的来说,这不会让你开心。

2。您只使用子矩阵一次

在这种情况下,最佳解决方案通常正是您在评论中提到的内容:

M(rmin:rmax, cmin:cmax)

仅使用子矩阵一次的特定情况是将其传递给函数一次。当然,子矩阵的内容可以在该函数中多次使用,但这是无关紧要的。