最初为MATLAB编写的软件库,包含MATLAB和C源文件,正在移植到Octave。 C代码使用MATLAB MEX文件接口。该库在MATLAB上无错误地工作,但在Octave上没有。 C源已关闭,我无法访问它,但是有人亲切地为我编译了它。
以下Octave代码
Y=ones(size(X)) + X;
失败并显示错误
下标索引必须是正整数或逻辑。
X
是MEX模块返回的矩阵。
我已经确认ones
和size
指的是内置函数,而不是被某些局部变量覆盖。
我该如何解决这个问题?
修改 分解为步骤:
S=size(X);
O=ones(S);
X+O;
在最后一行给出上述错误,即添加。 whos
命令输出:
octave:13> whos O X
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
O 512x512 2097152 double
X 512x512 2097152 double
Total is 524288 elements using 4194304 bytes
答案 0 :(得分:0)
您报告的错误没有理由。我无法弄清楚它可能在做什么。如果我生成您报告的X
矩阵,那么一切正常:
X = rand (512, 512);
S = size (X);
O = ones (S);
X+O;
我不知道您是如何确认使用内置函数的,所以可以检查一下这是否有效:
X = rand (512, 512);
S = builtin ("size", X);
O = builtin ("ones", S);
X+O;
或者可能是有人为你编译的mex文件以某种方式重载了double运算符?由于您没有它的来源,我建议您执行以下操作。调用mex函数后,保存X
,退出并在新的Octave会话中加载它。检查错误是否消失,如果没有,请与我们共享文件,以便我们至少可以尝试重现该文件。
X = your_closed_source_mex (...);
save -binary data.dat X
exit();
然后开始一个新的Octave会话:
load -binary data.dat
whos X # confirm that X is loaded
X = rand (512, 512);
S = size (X);
O = ones (S);
X+O;