给定大小为[hh,ww]
的图像,我想有效地创建一个大小为[hh*ww, hh*ww]
的稀疏矩阵。
对于给定像素的每个4或8邻居,稀疏矩阵应填充恒定值(比如-1
)
在适当的行(表示评估中的像素)和列(对应的4个邻居或8个邻居的像素)。
例如,考虑一个4像素邻域和[2,2]矩阵,得到的大小为[4,4]的稀疏矩阵如下:
0 -1 -1 0
-1 0 0 -1
-1 0 0 -1
0 -1 -1 0
第一行在#2和#3列填充-1
,因为这些像素位于像素1的4邻域中(下面给出了线性索引):
1 3
2 4
下面的代码可以完成工作,但只要矩阵变得太大,就会变得非常慢,例如,对于2000x2000矩阵。
hh=2;
ww=2;
%hh=2000;
%ww=2000;
sG = sparse(hh*ww,hh*ww);
linIdx = reshape(1:hh*ww, [hh ww]);
sG( sub2ind([hh*ww hh*ww], linIdx(:,1:end-1),linIdx(:,2:end)) ) = -1;
sG( sub2ind([hh*ww hh*ww], linIdx(1:end-1,:),linIdx(2:end,:)) ) = -1;
sG = max(sG, sG');
如何在使用大型矩阵时如何使代码高效?理想情况下,它应该适用于4-neighborhoods
或8-neighborhoods
。
答案 0 :(得分:2)
如前所述,我编写了一个有效计算稀疏邻接矩阵的函数。请参阅sparse_adj_matrix
。
用法:
[ii jj] = sparse_adj_matrix( [hh ww], 1, 1 ); % p is L1 for 4-connect
sG = sparse( ii, jj, -1, hh*ww, hh*ww ); % construct the sparse matrix
8-connect
[ii jj] = sparse_adj_matrix( [hh ww], 1, inf ); % p is inf for 8-connect
sG = sparse( ii, jj, -1, hh*ww, hh*ww ); % construct the sparse matrix
此函数可以处理任意维度(超过2个)常规网格,其中邻域不同于4或8(半径大于1,度量L1,L2或Loo)。