Matlab 其他。。。索引超过矩阵维数

Matlab 其他。。。索引超过矩阵维数,matlab,Matlab,我在Matlab中真的是一个不速之客,我正在用它做一个程序。这个程序只是尝试读取一个二进制数,例如(00011),前3个字符指示它将执行什么操作,其余的是将要进入操作的字符(加法、乘法等)。但是一个错误一直在折磨着我,“索引超过了矩阵的维数”,我知道matlab自动地将维数应用于矩阵,这让我一直在窃听 这是密码 function res = decPGL(varargin) persistent rInicial global r alto if isempty(varargin) r

我在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

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

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

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


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

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

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

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


有关调试器的更多信息,请参见。

“我知道matlab自动将维度应用于矩阵”…我不确定我是否理解。矩阵有维数,它不能对它做任何事情,也不能从MATLAB中获取它们“我知道matlab自动将维度应用于矩阵”…我不确定我是否理解。矩阵有维数,它不能对它做任何事情,也不能从MATLAB中获取它们好吧,我应用了你的建议,我得到了下一个:???试图访问r(3);索引超出范围,因为numel(r)=1。在50 r(i)=r(i)+r(j)时,错误为==>decPGL>unPaso;32 unPaso(程序A(ins))处的decPGL==>decPGL错误;如何使变量“r”的大小变大?
defPGL(00011)
将执行与
decPGL(11)
完全相同的操作。因此,您可能需要以另一种格式存储位(字符串
'00011'
、数组
[0 0 0 1 1]
或单元格数组
{0 0 0 1}
)???试图访问r(3);索引超出范围,因为numel(r)=1。在50 r(i)=r(i)+r(j)时,错误为==>decPGL>unPaso;32 unPaso(程序A(ins))处的decPGL==>decPGL错误;如何使变量“r”的大小变大?
defPGL(00011)
将执行与
decPGL(11)
完全相同的操作。因此,您可能需要以另一种格式存储位(字符串
'00011'
、数组
[0 0 0 1 1]
或单元格数组
{0 0 0 1}
)。
 %%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);