我们正在制作一个for循环,该循环应遍历矩阵中的所有行和列

时间:2018-10-02 07:13:22

标签: matlab for-loop matrix

我们想知道如何定义行和列,以便可以将所有行和列插入此函数

% 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

3 个答案:

答案 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 .]
  [. . . . .]

重要提示:仅适用于二次矩阵!