没有for循环,有没有办法做到这一点?

mar*_*l47 1 matlab for-loop function matrix

目前我在MATLAB中有这个功能

function [ y ] = pyramid( x )
%PYRAMID Returns a "pyramid"-shapped matrix.
y = zeros(x); % Creates an empty matrix of x by x.
rings = ceil(x/2); % Compute number of "rings".
for n = 1:rings
    % Take the first and last row of the ring and set values to n.
    y([n,x-n+1],n:x-n+1) = n*ones(2,x-2*(n-1));
    % Take the first and last column of the ring and set values to n.
    y(n:x-n+1,[n,x-n+1]) = n*ones(x-2*(n-1),2);
end
end
Run Code Online (Sandbox Code Playgroud)

其中产生以下输出:

piramide(4)
ans =
     1     1     1     1
     1     2     2     1
     1     2     2     1
     1     1     1     1

piramide(5)
ans =
     1     1     1     1     1
     1     2     2     2     1
     1     2     3     2     1
     1     2     2     2     1
     1     1     1     1     1

piramide(6)
ans =
     1     1     1     1     1     1
     1     2     2     2     2     1
     1     2     3     3     2     1
     1     2     3     3     2     1
     1     2     2     2     2     1
     1     1     1     1     1     1
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用for循环的情况下获得相同的结果?

rah*_*ma1 5

如果您有图像处理工具箱,您可以使用bwdist:

function y = pyramid(x)
    m([1 x], 1:x) = 1;
    m(1:x, [1 x]) = 1;
    y = bwdist(m,'chessboard')+1;
end
Run Code Online (Sandbox Code Playgroud)

其他方案使用min:

pyramid = @(x) min(min((1:x),(1:x).'), min((x:-1:1),(x:-1:1).'));
Run Code Online (Sandbox Code Playgroud)