我有这些错误:下标必须是整数1到(2 ^ 31)-1或逻辑

时间:2017-09-21 02:01:35

标签: matlab octave

我开始编程并选择octave couse它是免费的"版本" matlab,他们在我大学使用的程序。
因此,当我尝试运行我的代码时,这些问题出现了:

  

错误:I(0):下标必须是整数1到(2 ^ 31)-1或逻辑

我不知道为什么,因为当我用R代替 RR 时,代码可以正常工作。
我想也许问题是 R-Rn 并不是真正等于0,而是接近它,因此问题就是问题,但在用简单数字进行一些测试之后,我发现了它实际上是0,但也许它对于矩阵来说是不同的 请帮忙。
哦,不要注意巴西的笔记。

clear          
tic                                       %inicio da cronometragem      
f = @(x) 16*x.^6 + 8*x -6;                %definir função      
df = @(x) 96*x.^5 + 8;                    %definir derivada da função  
tol = 10E-4;                              %define a tolerancia  
xmin = -5;                                %menor valor para X  
xmax = 5;                                 %maior valor para X  
ymin = -5;                                %menor valor para Y  
ymax = 5;                                 %maior valor para Y  
npx = 8;                                  %número de pontos do eixo X  
npy = 8;                                  %número de pontos do eixo Y
dx = (xmax-xmin)/npx;                     %calculo da distância entre os 
pontos do eixo X  
dy = (ymax-ymin)/npy;                     %calculo da distância entre os 
pontos do eixo Y  
A = zeros(npy+1, npx+1);                  %define matriz cheia de 0, do 
tamanho definido por npx e npy  
x = xmin:dx:xmax;                         %define tamanho e distancia entre os pontos de uma linha      
y= ymin:dy:ymax;                          %define tamanho e distancia entre os pontos de uma coluna      
A = x+i*y';                               %preenche a matriz A com os valores desta multiplicação  
[m n] = size(A);                          %define m e n como o tamanho da linha e coluna, respectivamente, da matriz A  
I = zeros(m,n);                           %cria outra matriz, I, de mesmo tamanho de A, mas cheia de 0  
i = 0;                                    %numero de interações definido como 0  
R = I;  
for kk = 1:50                         %define numero de interações do metodo de newton   
  An = A-f(A)./df(A);                 %método de newton  
  i = i + 1;                          %aumentar o numero de interação a cada vez que repete  
  Rn = R  
  R = abs((An - A)) < tol             %cria uma matriz R com 1 ou 0 se a posição alcançou a tolerancia ou não  
  RR = R - Rn  
  I(RR) = i                           %preenche a matriz I com o numero de interação de cada posição da matriz A  
  A = An;                             %iguala A com An para que o metodo de newton possa continuar  
  end  

imagesc(I)                                %forma o fractal  
toc                                       %para o cronômetro          

2 个答案:

答案 0 :(得分:2)

它适用于R,因为R是一个逻辑数组 - 使用逻辑数组索引接受0作为值,因为逻辑数组索引中的0表示'不适用于此元素'。

当你减去你的数组Rn时,RR变成一个双精度数组。以这种方式索引不能接受0,因为没有第0个元素。

您需要将RR转换为逻辑数组(函数在MATLAB中为'逻辑')才能生效。

答案 1 :(得分:1)

当我运行代码时,我得到的RR全部为零。在MATLAB中,索引从1开始(因此零是无效索引)。尝试将RR = R - Rn更改为RR = R - Rn + 1。这至少让代码运行并生成图像(虽然我不确定图像是否正确)。