ここにクリーンで短い解決策を1 つ書きましたが、Lincoln のものより速いか遅いかはわかりません。を使ってみてください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
は、ゼロのみを含むすべての行/列を削除します。つまり、中間の行/列も削除されるため、1 つの領域が接続されていないと機能しません。しかし、地域が完全に接続されている場合、流域(IMO)は同じ地域インデックス(たとえば、地域1の場合は1)のみを返すため、これはあなたの場合には起こらないと思います。
Speedtest: まず、L と my 関数を定義します。今テスト:
>> 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.
これで、このテスト スニペットをコピーして変更し、Lincolns の計算速度も確認できます。
EDIT2: Lincolns ソリューションを次のように定義してC = myFun(L)
から、速度テストを再度実行します。
>> tic;
>> for i = 1:1000
B = myFun(L);
end
>> toc
Elapsed time is 1.01026 seconds.
はるかに高速に思えます:-) forループを使用していますが。