代码错误,出现数组索引必须为正整数或逻辑值。

matlab
代码在运行中出现

位置 1 处的索引无效。数组索引必须为正整数或逻辑值。
出错 untitled53>get_neighbors (第 100 行)
                neighbors(x,y) = grid(ni,nj);

出错 untitled53 (第 40 行)
            neighbors = get_neighbors(grain_id,i,j,neighborhood);

全部代码如下,希望帮忙看看其他还有没有错的地方。


L = 100; 
n = 100; 
dx = L/n; 
dt = 1; 
T = 100; 
k = 1; 
theta = 0; 
sigma = 0; 
phi = 0; 


grain_id = zeros(n,n); 
grain_color = zeros(n,n,3); 
recrystallized = zeros(n,n); 


for i = 1:n
    for j = 1:n
        if rand() 0.1;
            grain_id(i,j) = randi([1,10]);
            grain_color(i,j,:) = rand(1,1,3);
        end
    end
end


neighborhood = [1 1 1; 1 0 1; 1 1 1];
rule = @(x) recrystallize(x,k,theta,sigma,phi); 


for t = 0:dt:T
   
    new_grain_id = zeros(n,n);
    new_grain_color = zeros(n,n,3);
    new_recrystallized = zeros(n,n);
    for i = 1:n
        for j = 1:n
           
            neighbors = get_neighbors(grain_id,i,j,neighborhood);
           
            [new_grain_id(i,j),new_grain_color(i,j,:),new_recrystallized(i,j)] = rule(neighbors);
        end
    end
   
    grain_id = new_grain_id;
    grain_color = new_grain_color;
    recrystallized = new_recrystallized;
   
    visualize(grain_id,grain_color);
end


function [new_id,new_color,new_recrystallized] = recrystallize(neighbors,k,theta,sigma,phi)
    
    new_color = [0 0 0];
    new_recrystallized = 0;
    if sum(neighbors(:)) == 0 
        return
    elseif sum(neighbors(:) > 0) == 0 
        new_id = -1;
        new_color = [1 1 1];
        return
    else 
        dk = randn()*0.1;
        new_k = k + dk;
      
        dtheta = randn()*0.1;
        new_theta = theta + dtheta;
       
        dsigma = randn()*0.1;
        new_sigma = sigma + dsigma;
        
        dphi = randn()*0.1;
        new_phi = phi + dphi;
        
        new_id = neighbors(2,2);
        new_color = [0 0 0];
        new_recrystallized = 0;
        if new_phi > 0.5 
            new_id = randi([1,10]);
            new_color = rand(1,1,3);
            new_recrystallized = 1;
        end
    end
end


function neighbors = get_neighbors(grid,i,j,neighborhood)
    [n,m] = size(grid);
    [h,w] = size(neighborhood);
    neighbors = zeros(h,w);
    for x = 1:h
        for y = 1:w
            ni = i + x - 2;
            nj = j + y - 2;
            if ni 1 || ni > n || nj < 1 || nj > m;
                neighbors(x,y) = -1; 
            else
                neighbors(x,y) = grid(ni,nj);
            end
        end
    end
end