在绘图 MATLAB 中创建分形图像但绘图为空
Creating fractal image in a plot MATLAB but the plot is empty
我正在编写一个函数来在绘图中创建分形图像。当我 运行 我的代码时,会弹出一个图,但它是空的。我认为问题出在我的 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 (&&
) 语句。此外,您应该将 plot
代码放在任何 if/elseif/else
语句之外。您目前在最后一个 elseif
语句中包含它,因此 plot
只有在满足最后一个条件时才会 运行 。
明确地说,如果您想比较某个值是否在某个范围内,请执行以下操作:
if (prob >= a && prob < b)
和elseif
:
elseif (prob >= a && prob < b)
a
和 b
是您要比较的下限和上限。此 包括 a
但 不包括 b
在比较中。
为了使它正常工作,我对您当前的代码也有一些评论和建议:
- 你 运行 你的函数只有一个
x
和 y
值,但你试图在你的 for
循环,就好像这些是数组一样。我假设这本质上是 递归 所以你需要在你的 if/else
条件中实际使用 X
和 Y
而不是 x
和 y
.
- 由于您使用的是单个值,因此使用
:
访问第二个维度是多余的。别管它了。
- 您创建了
X
和 Y
,但随后将 X
覆盖为二维数组的起始位置...我认为您打算替换 X
和Y
的第一个元素,而不是起始位置。
- 我认为您的第一个
if
陈述是不正确的。您想要访问 Y(i)
而不是 Y(1)
不?...鉴于您的代码到目前为止的行为。
- 你的第一个条件肯定会把事情搞砸的。这就是说只要值大于等于0.01,就执行那条语句。否则,请尝试执行其他条件,但实际上这些条件可能永远行不通,因为您正在寻找大于 0.01 的值,而第一个条件已经为您处理了该值。我假设您打算检查它是否 小于 而不是 0.01。
- 在 MATLAB 中执行
value comparecondition array
意味着如果 数组 中的任何一个值与 value
提供的条件匹配,则此语句为真。这将对您当前的代码产生意想不到的副作用。
- 确保每个
if
语句涵盖的范围是连续的(即范围之间没有间隙或断开连接)。现在,您正在检查 0.01 间隔内的值。 rand
生成介于 0 和 1 之间的随机值。如果你的值为 0.15 会怎样? None 的 if
条件处理此问题,因此您需要使用我上面谈到的内容。
- 您很可能得到一个空白图,因为您的
MarkerSize
属性非常小....您将其设置为 1 个像素。除非你有超人的视觉,否则你无法真正想象到这一点。使 MarkerSize
变大。
- 在
plot
之后使用 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
我现在得到这个数字 fractal(1,1,1000)
:
...很酷的分形顺便说一句!
我正在编写一个函数来在绘图中创建分形图像。当我 运行 我的代码时,会弹出一个图,但它是空的。我认为问题出在我的 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 (&&
) 语句。此外,您应该将 plot
代码放在任何 if/elseif/else
语句之外。您目前在最后一个 elseif
语句中包含它,因此 plot
只有在满足最后一个条件时才会 运行 。
明确地说,如果您想比较某个值是否在某个范围内,请执行以下操作:
if (prob >= a && prob < b)
和elseif
:
elseif (prob >= a && prob < b)
a
和 b
是您要比较的下限和上限。此 包括 a
但 不包括 b
在比较中。
为了使它正常工作,我对您当前的代码也有一些评论和建议:
- 你 运行 你的函数只有一个
x
和y
值,但你试图在你的for
循环,就好像这些是数组一样。我假设这本质上是 递归 所以你需要在你的if/else
条件中实际使用X
和Y
而不是x
和y
. - 由于您使用的是单个值,因此使用
:
访问第二个维度是多余的。别管它了。 - 您创建了
X
和Y
,但随后将X
覆盖为二维数组的起始位置...我认为您打算替换X
和Y
的第一个元素,而不是起始位置。 - 我认为您的第一个
if
陈述是不正确的。您想要访问Y(i)
而不是Y(1)
不?...鉴于您的代码到目前为止的行为。 - 你的第一个条件肯定会把事情搞砸的。这就是说只要值大于等于0.01,就执行那条语句。否则,请尝试执行其他条件,但实际上这些条件可能永远行不通,因为您正在寻找大于 0.01 的值,而第一个条件已经为您处理了该值。我假设您打算检查它是否 小于 而不是 0.01。
- 在 MATLAB 中执行
value comparecondition array
意味着如果 数组 中的任何一个值与value
提供的条件匹配,则此语句为真。这将对您当前的代码产生意想不到的副作用。 - 确保每个
if
语句涵盖的范围是连续的(即范围之间没有间隙或断开连接)。现在,您正在检查 0.01 间隔内的值。rand
生成介于 0 和 1 之间的随机值。如果你的值为 0.15 会怎样? None 的if
条件处理此问题,因此您需要使用我上面谈到的内容。 - 您很可能得到一个空白图,因为您的
MarkerSize
属性非常小....您将其设置为 1 个像素。除非你有超人的视觉,否则你无法真正想象到这一点。使MarkerSize
变大。 - 在
plot
之后使用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
我现在得到这个数字 fractal(1,1,1000)
:
...很酷的分形顺便说一句!