matlab - 在 Matlab 中结合基于索引和逻辑寻址

标签 matlab performance

考虑一个矩阵X。我必须用矩阵 Z(大小为 row2-row1+1, col2-col1+1) 但仅在逻辑矩阵 L(大小为 row2-row1+1col2-col1+1) 为真。

例如如果

 X=[ 1  2  3  4  5  6
    11 12 13 14 15 16
    21 22 23 24 25 26
    31 32 33 34 34 36]
 Z=[31 41
    32 42]
 L=[ 1 0
     0 1]
 row1 = 2; row2 = 3; col1 = 3; col2 = 4 

然后在更新后我应该得到:

 X=[ 1  2  3  4  5  6
    11 12 31 14 15 16
    21 22 23 42 25 26
    31 32 33 34 34 36]

目前我在做以下事情:

Y = X(row1:row2, col1:col2);
Y(L) = Z(L); 
X(row1:row2, col1:col2) = Y;

这段代码处于紧密循环中,根据 Matlab (v2019a) 的分析器,这是我程序的主要瓶颈。在实际代码中,X 是一个 2000x1500x3 的立方体; row1row2col1col2ZL 改变循环。

问题是是否可以将其重写为单个/更快的作业。

谢谢。

最佳答案

老实说,在没有看到您的实际代码的情况下,我感觉您的解决方案可能会尽可能快。我这么说的原因是因为我通过创建一些更接近您的实际问题的随机样本数据来测试了一些不同的解决方案。我假设 Xuint8 类型的图像,大小为 2000×1500×3,Z 是大小 N-by-N(即我们只会修改 X 的第一页),L 是一个 N-by-N逻辑数组,行列索引随机选择:

X = randi([0 255], 2000, 1500, 3, 'uint8');
N = 20;  % Submatrix size
Z = randi([0 255], N, N, 'uint8');
L = (rand(N, N) > 0.5);
row1 = randi([1 2000-N]);
row2 = row1+N-1
col1 = randi([1 1500-N]);
col2 = col1+N-1;

然后我测试了 3 种不同的解决方案:您的原始解决方案,使用 find 的解决方案和 sub2ind创建一个 linear index对于 X,以及为 X 创建逻辑索引的解决方案:

% Original solution:
Y = X(row1:row2, col1:col2, 1);
Y(L) = Z(L);
X(row1:row2, col1:col2, 1) = Y;

% Linear index solution:
[rIndex, cIndex] = find(L);
X(sub2ind(size(X), rIndex+row1-1, cIndex+col1-1)) = Z(L);

% Logical index solution
[R, C, ~] = size(X);
fullL = false(R, C);
fullL(row1:row2, col1:col2) = L;
X(fullL) = Z(L);

我使用 timeit 使用随机生成的样本数据反复测试了这些并发现您的原始解决方案始终是最快的。线性索引解决方案非常接近,但速度稍慢。逻辑索引解决方案需要两倍多的时间。

关于matlab - 在 Matlab 中结合基于索引和逻辑寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145973/

相关文章:

performance - 平均处理速度越来越慢

algorithm - 矩阵中给定区域的中值

matlab - 在MATLAB中序列化多维数组以插入数据库的最简单方法?

matlab - 你能为血压与特定年龄创建箱线图吗 (MATLAB)

jquery - 我该如何编写这个 jQuery 函数,使其干净高效?

2 的幂的 python itertools 排列太慢

c++ - 将 float * 或 int * 分配给 mxArray

c++ - 同步 MATLAB 和 C++

c++ - 在适用于 Linux 的 Eclipse (C++) 中链接到 matlab 库

Linux Ubuntu Tomcat Best Config 避免内存不足