Image 在绘图MATLAB中创建分形图像,但绘图为空
我正在编写一个函数,在一个图中创建一个分形图像。当我运行代码时,会弹出一个绘图,但它是空的。我认为这些问题存在于我的if/elseif语句中,但我很难找到它。我的代码是: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+
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)
notY(1)
no?。。。考虑到目前为止代码的行为值比较条件数组
,意味着如果数组中的任何一个值值
提供的条件匹配,则此语句为真。这将对当前代码产生意外的副作用
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