我们想知道如何定义行和列,以便可以将所有行和列插入此函数
% V is our matrix
% i = columns of the matrix V
%j = rows of the matrix V
function quantity = neighbours(V,i,j)
quantity = sum(sum(V(i-1:i+1,j-1:j+1)))-V(i,j)
end
答案 0 :(得分:1)
如果需要整个矩阵V的输出,则可以定义所需邻域大小和样式的窗口,然后将矩阵V与其卷积:
例如对于8个社区,您可以这样做:
T
如果您需要说4相邻,则可以将上面的w替换为:
function quantity = neighbours(V)
w = [1 1 1; 1 0 1; 1 1 1]; % define a window for summing 8-neigborhood of a pixel
quantity = conv2(V, w, 'same'); % result matrix
end
答案 1 :(得分:0)
我仍然不确定我是否能完全理解该问题,但是我觉得如果不尝试,我们将无法再进一步。因此,这是您的功能,但它考虑了优势。如果您不熟悉MatLab,则必须将其保存在一个名为“ neighbours.m”的附加文件中。
function quantity = neighbours(V,i,j)
height=size(V,1);
width=size(V,2);
quantity = sum(sum(V(max(i-1,1):min(i+1,height),max(1,j-1):min(j+1,width))))-V(i,j);
end
如果行或列在矩阵的边缘,则可以说(1,1)面积减小以保留在矩阵内部。否则,您将得到一个错误(可能“下标索引必须是实数正整数或逻辑”。)这样,您就可以遍历不是很有效但可以解决问题的矩阵。该代码可以在“ neighbours.m”文件之外的任何地方运行
codeV = ones(5,3);
amount_of_neighbors = zeros(size(zcodeV));
for i=1:size(zcodeV,1) %height
for j=1:size(zcodeV,2) %width
amount_of_neighbors(i,j) = neighbours(codeV,i,j);
end
end
disp(amount_of_neighbors)
答案 2 :(得分:0)
我想到了一个奇怪的主意,但是它应该非常有效!为此,您只需要确保矩阵V
的行数与列数相同即可。该函数将输出一个尺寸与V
相同的矩阵,该矩阵在每个位置都包含所有直接邻居(不包括对角邻居)的总和。
function quantity = neighbours(V)
n = length(V(1,:)); % Size of quadratic matrix
v = ones(n,1); % Vector used to create matrix A
A = diag(v,1) + diag(v,-1);
quantity = V*A+(V'*A)';
end
说明:您无需两次遍历Matrix,而是使用两个简单的矩阵运算为大型系统花费大量计算时间。
A看起来像这样:
[0 1 0 . .]
[1 0 1 0 .]
A=[0 1 0 1 .]
[. 0 1 0 .]
[. . . . .]
重要提示:仅适用于二次矩阵!