我在这里写了一个干净/简短的解决方案,但我不知道它是否比林肯的解决方案更快或更慢。只需尝试使用tic/toc
.
function A = removePadding(L, x)
A = (L==x);
A(all(A == 0, 2), :)=[];
A(:, all(A == 0, 1))=[];
end
L = [1 1 2;1 0 2; 1 2 2; 0 0 2];
u = unique(L(:))
arrayfun(@(x) removePadding(L, x)*2, u(2:end), 'UniformOutput', false)
将输出:
ans =
{
[1,1] =
1 1
1 0
1 0
[2,1] =
0 2
0 2
2 2
0 2
}
注意:该函数removePadding
将删除所有仅包含零的行/列。这意味着如果一个区域不连接,它将无法工作,因为中间行/列也将被删除。但我认为这不会发生在你的情况下,因为如果区域完全连接,分水岭 (IMO) 只会返回相同的区域索引(例如区域 1 为 1)。
Speedtest:首先,定义了L和我的函数。现在测试:
>> tic;
for i = 1:1000
u = unique(L(:));
B = arrayfun(@(x) removePadding(L, x)*2, u(2:end), 'UniformOutput', false);
end
>> toc
Elapsed time is 4.89563 seconds.
现在您可以复制此测试片段并对其进行修改以检查林肯计算的速度。
EDIT2:我将林肯解决方案定义为C = myFun(L)
,然后再次运行速度测试:
>> tic;
>> for i = 1:1000
B = myFun(L);
end
>> toc
Elapsed time is 1.01026 seconds.
似乎要快得多:-) 即使使用 for 循环。