首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matlab中不复制就能求出子矩阵

如何在Matlab中不复制就能求出子矩阵
EN

Stack Overflow用户
提问于 2016-08-21 09:41:46
回答 2查看 251关注 0票数 3

我有一个很大的矩阵,我需要从遍及整个大矩阵的滑动窗口中提取一个小矩阵,但在操作过程中,提取的矩阵的内容不会改变,所以我想提取子矩阵,而不是创建新的副本,而只是像C指针一样指向大矩阵的一部分。我该怎么做呢?请帮帮我,非常感谢:)

EN

回答 2

Stack Overflow用户

发布于 2016-08-21 18:15:37

我做了一些基准测试,以测试不使用显式临时矩阵是否更快,它可能不是:

代码语言:javascript
复制
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

代码语言:javascript
复制
dir_time =
      0.22739
tmp_time =
      0.22339

所以看起来使用临时变量只会让你的代码更易读,而不是更慢。

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 21:56:21

在这个答案中,我描述了通常情况下的“最佳”解决方案。对于这个答案,我将“最佳”定义为可读性最好,而不会对性能造成重大影响。(部分由现有答案显示)。

基本上,你可能会遇到两种情况。

1.您多次使用您的子矩阵

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

代码语言:javascript
复制
A = M(rmin:rmax, cmin:cmax)

可能有办法绕过它(定义一个函数/匿名函数,为您索引到矩阵中),但一般来说,这不会让您满意。

2.你只用了你的子矩阵一次

在这种情况下,最好的解决方案通常就是您在评论中提到的:

代码语言:javascript
复制
M(rmin:rmax, cmin:cmax)

子矩阵只使用一次的特定情况是,它被传递给一个函数一次。当然,子矩阵的内容可能会在该函数中多次使用,但这是不相关的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39060149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档