2013-02-16 287 views
1

我最近开始R中的编码和偶然发现这个代码,它绘制曼德尔布罗分形:如何在使用R绘图时更改分辨率?

library(caTools)   # external package providing write.gif function 
jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", 
           "yellow", "#FF7F00", "red", "#7F0000")) 
m <- 1200    # define size 
C <- complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), 
       imag=rep(seq(-1.2,1.2, length.out=m), m)) 
C <- matrix(C,m,m)  # reshape as square matrix of complex numbers 
Z <- 0     # initialize Z to zero 
X <- array(0, c(m,m,20)) # initialize output 3D array 
for (k in 1:20) {  # loop with 20 iterations 
    Z <- Z^2+C    # the central difference equation 
    X[,,k] <- exp(-abs(Z)) # capture results 
} 
write.gif(X, "Mandelbrot.gif", col=jet.colors, delay=100) 

我做了一些测试,看结果。我发现这些图像的分辨率太低,所以我尝试使用这些代码来提高分辨率:本质上,它计算两倍的功能(即f(1),f(1.5),f(2),f(2.5)而不是f(1),f(2)),我想。

library(caTools)   # external package providing write.gif function 
jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", 
           "yellow", "#FF7F00", "red", "#7F0000")) 
m <- 1200    # define size 
C <- complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), 
       imag=rep(seq(-1.2,1.2, length.out=m), m)) 
C <- matrix(C,m,m)  # reshape as square matrix of complex numbers 
Z <- 0     # initialize Z to zero 
X <- array(0, c(m,m,20*2)) # initialize output 3D array 
for (n in 1:20) {  # loop with 20 iterations 
    for (m in 1:2) { # Loop twice 
    k <- n+m/2 # Does the trick of adding .5 
    Z <- Z^2+C    # the central difference equation 
    X[,,k] <- exp(-abs(Z)) # capture results 
    } 
} 
write.gif(X, "Mandelbrot.gif", col=jet.colors, delay=100) 

虽然它计算数字量的两倍,的Mandelbrot.gif分辨率似乎是相同的,以及尺寸(为1200x1200)。

+0

我没有尝试m的更多值,因为它导致了一个太大的变量。 – 2013-02-16 12:39:49

回答

1

的分辨率提高了简单地增加的m值。然而,在X元素的数目为m^2 * 20,其可以很容易地变得大于2^31-1,其是向量长度的电流限制(一个阵列是具有附加属性的向量)在R.要么你找到一个不同的函数来创建GIF动画,这并不需要保存的所有信息在一个阵列,或者您等待R的下一个重大更新,这将增加AFAIK对象大小限制。

下面的代码允许更高的分辨率,但要注意,它需要大量的CPU时间,你会很快耗尽内存。你还需要ImageMagick。

library(animation)   # external package providing saveGIF function 
jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", 
           "yellow", "#FF7F00", "red", "#7F0000")) 
m <- 200    # define size 
C <- complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), 
       imag=rep(seq(-1.2,1.2, length.out=m), m)) 
C <- matrix(C,m,m)  # reshape as square matrix of complex numbers 
Z <- 0     # initialize Z to zero 
saveGIF(
    for (k in 1:20) {  # loop with 20 iterations 
    Z <- Z^2+C    # the central difference equation 
    image(exp(-abs(Z)),col=jet.colors(255)) # plot results 
    },"Mandelbrot2.gif" 
)