Image 在绘图MATLAB中创建分形图像,但绘图为空

Image 在绘图MATLAB中创建分形图像,但绘图为空,image,matlab,plot,fractals,Image,Matlab,Plot,Fractals,我正在编写一个函数,在一个图中创建一个分形图像。当我运行代码时,会弹出一个绘图,但它是空的。我认为这些问题存在于我的if/elseif语句中,但我很难找到它。我的代码是: function [] = fractal(x, y, N) close all start = [x, y]; X = zeros(N+1,1); Y = zeros(N+1,1); X = start; hold on for i = 1:N prob = rand; if prob >= 0.01 X(i+

我正在编写一个函数,在一个图中创建一个分形图像。当我运行代码时,会弹出一个绘图,但它是空的。我认为这些问题存在于我的if/elseif语句中,但我很难找到它。我的代码是:

function [] = fractal(x, y, N)
close all
start = [x, y];
X = zeros(N+1,1);
Y = zeros(N+1,1);
X = start;
hold on
for i = 1:N
prob = rand;
if prob >= 0.01
    X(i+1,:) = 0;
    Y(i+1,:) = 0.16*y(1);
elseif prob == 0.02:0.86
    X(i+1,:) = (0.85*x(i))-(0.04*y(i));
    Y(i+1,:) = (-0.04*x(i))+(0.85*y(i))+1.6;
elseif prob == 0.87:0.94
    X(i+1,:) = (0.2*x(i))-(0.26*y(i));
    Y(i+1,:) = (0.23*x(i))+(0.22*y(i))+1.6;
elseif prob == 0.95:1.0
    X(i+1,:) = (-0.15*x(i))+(0.28*y(i));
    Y(i+1,:) = (0.26*x(i))+(0.24*y(i))+0.44;
plot(X(i,:),Y(i,:),'.','Markersize',1)
axis equal 
    end
end
end
当我用

>> fractal(1,1,1000)

。。。出现一个绘图,但它是空的。

是的。。。这是您的
if
语句,但是您的代码还有更多的问题,但我们将在稍后处理这些问题。让我们首先讨论一下您的
if
语句。如果要在示例的值范围内进行比较,则需要使用AND(
&&
)语句。此外,您应该将
绘图
代码放在任何
if/elseif/else
语句之外。当前,它位于上一个
elseif
语句中,因此只有在满足上一个条件时,
plot
才会运行

为了明确起见,如果要比较某个值是否在某个范围内,请执行以下操作:

if (prob >= a && prob < b)
a
b
是要比较的下限和上限。这包括比较中的
a
,但不包括
b

我还对您当前的代码提出了一些意见和建议,以使其发挥作用:

  • 您使用单个
    x
    y
    值运行函数,但您试图在
    for
    循环中访问该
    x
    y
    ,就好像这些是数组一样。我假设这本质上是递归的,所以您需要在
    if/else
    条件中实际使用
    X
    Y
    ,而不是
    X
    Y
  • 由于您使用的是单个值,因此使用
    访问第二个维度是多余的。别提了
  • 创建
    X
    Y
    ,然后覆盖
    X
    作为二维数组的起始位置。。。我想您是想用起始位置替换
    X
    Y
    的第一个元素
  • 你的第一个
    if
    声明我认为是不正确的。您希望访问
    Y(i)
    not
    Y(1)
    no?。。。考虑到目前为止代码的行为
  • 你的第一个条件肯定会把事情搞砸。也就是说,只要该值大于或等于0.01,就执行该语句。否则,请尝试并执行其他条件,这些条件实际上可能永远不起作用,因为您正在查找大于0.01的值,而第一个条件已经为您处理了这些值。我想你是想检查它是否小于0.01
  • 在MATLAB中执行
    值比较条件数组
    ,意味着如果数组中的任何一个值
    提供的条件匹配,则此语句为真。这将对当前代码产生意外的副作用
  • 确保每个
    if
    语句所涵盖的范围是连续的(即范围之间没有间隙或断开连接)。现在,您正在检查0.01间隔内的值
    rand
    生成0到1之间的随机值。如果你的值是0.15呢?您的
    if
    条件都不能处理这个问题,所以您需要使用我上面提到的内容
  • 由于
    MarkerSize
    属性非常小,您很可能会得到一个空白绘图。。。。将其设置为1像素。除非你有超人的视觉,否则你无法真正想象这一点。使
    标记变大
  • 使用
    drawnow
    绘图后立即将结果更新到屏幕

  • 因此,在重构代码时,您应该使其看起来像这样:

    function [] = fractal(x, y, N)
    close all
    start = [x, y];
    X = zeros(N+1,1);
    Y = zeros(N+1,1);
    %// Change - Initialize first elements of X and Y to be the starting positions
    X(1) = start(1);
    Y(1) = start(2);
    hold on
    for i = 1:N
        prob = rand;
        if prob <= 0.01 %// Change
            X(i+1) = 0;
            Y(i+1) = 0.16*Y(i); %// Change
        elseif (prob > 0.01 && prob <= 0.86) %// Change
            X(i+1) = (0.85*X(i))-(0.04*Y(i)); %// Change
            Y(i+1) = (-0.04*X(i))+(0.85*Y(i))+1.6; %// Change
        elseif (prob > 0.86 && prob <= 0.94) %// Change
            X(i+1) = (0.2*X(i))-(0.26*Y(i)); %// Change
            Y(i+1) = (0.23*X(i))+(0.22*Y(i))+1.6; %// Change
        elseif (prob > 0.94 && prob <= 1.0) %// Change
            X(i+1) = (-0.15*X(i))+(0.28*Y(i)); %// Change
            Y(i+1) = (0.26*X(i))+(0.24*Y(i))+0.44; %// Change
        end
    
        %// Change - move outside of if/else blocks
        %// Also make marker size larger
        plot(X(i),Y(i),'.','Markersize',18); %// Change
        axis equal 
    
        %// Add just for kicks
        drawnow;
    end
    
    end
    
    函数[]=分形(x,y,N)
    全部关闭
    开始=[x,y];
    X=零(N+1,1);
    Y=零(N+1,1);
    %//更改-将X和Y的第一个元素初始化为起始位置
    X(1)=开始(1);
    Y(1)=开始(2);
    等等
    对于i=1:N
    prob=兰德;
    
    如果prob为0.01&&prob为0.86&&prob为0.94&&prob,为什么要重复检查
    prob
    ?如果代码到达第行,比如说,
    elseif(prob>0.86…
    可以肯定的是,
    prob>0.86
    ,因为上面的
    elseif
    语句将被计算并循环到下一个迭代。如果prob@Crowley这是真的,但我喜欢显式的。X也可以通过以下方式定义:
    X=[X;零(N,1)]
    @Crowley我感谢您的评论,但我喜欢保留我的代码。谢谢。在第一种情况下,我试图指出它不是必须明确的。在第二种情况下,声明可以更短,更能防止错误。在这两种情况下,都不值得单独回答。
    function [] = fractal(x, y, N)
    close all
    start = [x, y];
    X = zeros(N+1,1);
    Y = zeros(N+1,1);
    %// Change - Initialize first elements of X and Y to be the starting positions
    X(1) = start(1);
    Y(1) = start(2);
    hold on
    for i = 1:N
        prob = rand;
        if prob <= 0.01 %// Change
            X(i+1) = 0;
            Y(i+1) = 0.16*Y(i); %// Change
        elseif (prob > 0.01 && prob <= 0.86) %// Change
            X(i+1) = (0.85*X(i))-(0.04*Y(i)); %// Change
            Y(i+1) = (-0.04*X(i))+(0.85*Y(i))+1.6; %// Change
        elseif (prob > 0.86 && prob <= 0.94) %// Change
            X(i+1) = (0.2*X(i))-(0.26*Y(i)); %// Change
            Y(i+1) = (0.23*X(i))+(0.22*Y(i))+1.6; %// Change
        elseif (prob > 0.94 && prob <= 1.0) %// Change
            X(i+1) = (-0.15*X(i))+(0.28*Y(i)); %// Change
            Y(i+1) = (0.26*X(i))+(0.24*Y(i))+0.44; %// Change
        end
    
        %// Change - move outside of if/else blocks
        %// Also make marker size larger
        plot(X(i),Y(i),'.','Markersize',18); %// Change
        axis equal 
    
        %// Add just for kicks
        drawnow;
    end
    
    end