Другое ... Индекс превышает размеры матрицы - PullRequest
0 голосов
/ 28 ноября 2011

Я действительно новичок в Matlab, и я делал в нем программу. Эта программа просто пытается прочитать двоичное число, например (00011), первые 3 символа определяют, какую операцию она будет выполнять, а остальные - те, которые собираются ввести операцию (сложение, умножение и т. Д.). Но ошибка продолжает убивать меня, «индекс превышает размеры матрицы», я понимаю, что Matlab автоматически применяет размеры к матрице, и это заставляет меня глючить на спине ...

вот код.

function res = decPGL(varargin)
persistent rInicial
global r alto


if isempty(varargin)
   res = rInicial;
elseif isequal(varargin{1},'r') || isequal(varargin{1},'R')
   rInicial = varargin{2};
   res = rInicial;
else
   alto = 0;               % bandera que termina el programa
   programa = varargin{1}; % vector del programa completo
   ins = 1;                % número de instrucción que se va a ejecutar
   r = rInicial;           % estado inicial de registros


 while ins<=length(programa) && ~alto
    unPaso(programa(ins));
    ins = ins + 1;
 end
 res = r;
end



function unPaso(segmento)
% executes a segment of the program
global r alto

hh4 = ihighh(segmento,4);
i = ilow(ihighh(segmento,2),2)+1;
j = ilow(segmento,2)+1;
if hh4 <= 5
switch hh4
  case 0
     r(i) = r(i) + r(j);
  case 1
     r(i) = r(i) - r(j);
  case 2
     r(i) = r(i) * r(j);
  case 3
     if r(j) ~= 0
        r(i) = r(i)/r(j);
     end
  case 4
     r(i) = j;
  case 5
     t = r(i);
     r(i) = r(j);
     r(j) = t;
end
elseif hh4==6
switch i
  case 1
     r(j) = exp(r(j));
  case 2
     r(j) = log(abs(r(j)));
  case 3
     r(j) = r(j)^2;
  case 4
     r(j) = sqrt(abs(r(j)));
end
elseif hh4==7
switch i
  case 1
     r(j) = -r(j);
  case 2
     r(j) = sin(r(j));
  case 3
     r(j) = cos(r(j));
  case 4
     r(1) = r(j);
     alto = 1;
end
end

Проблема в переменной «r», когда в переключателе и выбран регистр, отмечается ошибка «Индекс превышает размеры матрицы».

Есть идеи или предложения, чтобы решить эту проблему?

Заранее спасибо.

PS: забыл поставить ihighh код и я низкий ... извините ... вот оно ....

 %%ihigh
function res = ihigh(p, m, varargin)
if length(varargin)>=1
    B = varargin{1};
else
    B = 2;
end

res = p - mod(p,B.^m);

%%ihighh
function res = ihighh(p, m, varargin)
if length(varargin)>=1
    B = varargin{1};
else
    B = 2;
end

res = ihigh(p,m,B)./(B.^m);

%%ilow
function res = ilow(p, m, varargin)

if length(varargin)>=1
   B = varargin{1};
else
   B = 2;
end

res = mod(p,B.^m);

1 Ответ

3 голосов
/ 28 ноября 2011

Я думаю, что ваш код неполон.Но в любом случае, это более полезно, если вы отлаживаете код самостоятельно.

В MATLAB это можно легко сделать с помощью команды dbstop if error.Затем запустите вашу программу, и она будет переключаться в режим отладки при возникновении ошибки.Затем вы должны вручную исследовать размер r и какой индекс вы пытаетесь получить доступ.Они не будут совпадать, поэтому вы должны определить, является ли матрица слишком маленькой или ваш индекс находится в неправильном диапазоне, и исправить это.

Чтобы выйти из режима отладки, введите команду dbquit и, чтобы предотвратить MATLABдля автоматического переключения в режим отладки просто запустите dbclear if error.

Более подробную информацию об отладчике можно найти в документации MATLAB .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...