我有一个很大的矩阵,我需要从遍及整个大矩阵的滑动窗口中提取一个小矩阵,但在操作过程中,提取的矩阵的内容不会改变,所以我想提取子矩阵,而不是创建新的副本,而只是像C指针一样指向大矩阵的一部分。我该怎么做呢?请帮帮我,非常感谢:)
发布于 2016-08-21 18:15:37
我做了一些基准测试,以测试不使用显式临时矩阵是否更快,它可能不是:
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所以看起来使用临时变量只会让你的代码更易读,而不是更慢。
发布于 2016-08-22 21:56:21
在这个答案中,我描述了通常情况下的“最佳”解决方案。对于这个答案,我将“最佳”定义为可读性最好,而不会对性能造成重大影响。(部分由现有答案显示)。
基本上,你可能会遇到两种情况。
1.您多次使用您的子矩阵
在这种情况下,通常最好的解决方案是创建一个包含子矩阵的临时变量。
A = M(rmin:rmax, cmin:cmax)可能有办法绕过它(定义一个函数/匿名函数,为您索引到矩阵中),但一般来说,这不会让您满意。
2.你只用了你的子矩阵一次
在这种情况下,最好的解决方案通常就是您在评论中提到的:
M(rmin:rmax, cmin:cmax)子矩阵只使用一次的特定情况是,它被传递给一个函数一次。当然,子矩阵的内容可能会在该函数中多次使用,但这是不相关的。
https://stackoverflow.com/questions/39060149
复制相似问题