2011-11-28 165 views
0

我真的是一个在Matlab的noobie,我正在制作一个程序。这个程序只是试图读取一个二进制数,例如(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

“我明白,matlab自动将维度应用于矩阵”......我不确定_I_明白这一点。矩阵_has_维度,它不能做任何事情,并没有从MATLAB中得到它们。 ;-) –

回答

3

我觉得你的代码是不完整的。但无论如何,如果您自己调试代码,它会更有用。

在MATLAB中,这可以通过dbstop if error命令轻松完成。然后运行你的程序,每当发生一个未被捕获的错误时它就会切换到调试模式。然后,您应该手动调查r的大小以及您尝试访问的索引。这些不匹配,所以您应该确定矩阵是否太小或您的索引是否在错误的范围内并且正确。

要退出调试模式,请输入命令dbquit并防止MATLAB自动切换到调试模式,只需运行dbclear if error即可。

关于调试器的更多信息可以在MATLAB documentation中找到。

+0

那么,我申请了你的建议,我得到了下一个: –

+0

我用decPGL(00011),和matlab给了我下一件事.. –

+0

???试图访问r(3);指数越界,因为numel(r)= 1。 错误==> decPGL> unPaso at 50 r(i)= r(i)+ r(j); 错误在==> decPGL在32 unPaso(programa(ins));我怎样才能让变量“r”的大小变大? –

相关问题