Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Octave 使用MEX文件在倍频程中加法失败_Octave_Mex - Fatal编程技术网

Octave 使用MEX文件在倍频程中加法失败

Octave 使用MEX文件在倍频程中加法失败,octave,mex,Octave,Mex,一个最初为MATLAB编写的软件库,由MATLAB和C源文件组成,正在移植到Octave。C代码使用MATLAB MEX文件接口。该库在MATLAB上正常工作,但在倍频程上不工作。C源代码已经关闭,我没有访问权限,但是有人为我编译了它 下面的倍频程代码 Y=ones(size(X)) + X; 由于错误而失败 下标索引必须是正整数或逻辑数 X是MEX模块返回的矩阵。 我已经验证了ones和size是指内置函数,并且没有被一些局部变量覆盖 我怎样才能解决这个问题 编辑 分为几个步骤: S=siz

一个最初为MATLAB编写的软件库,由MATLAB和C源文件组成,正在移植到Octave。C代码使用MATLAB MEX文件接口。该库在MATLAB上正常工作,但在倍频程上不工作。C源代码已经关闭,我没有访问权限,但是有人为我编译了它

下面的倍频程代码

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

您报告的错误没有理由被忽略。我不知道它可能在做什么。如果我生成您报告的
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
,退出,并将其加载到新的倍频程会话中。检查错误是否消失,如果没有,请与我们共享该文件,以便我们至少可以尝试复制它

X = your_closed_source_mex (...);
save -binary data.dat X
exit();
然后开始一个新的倍频程会话:

load -binary data.dat
whos X # confirm that X is loaded
X = rand (512, 512);
S = size (X);
O = ones (S);
X+O;

首先找出导致错误的部分。
s=size(X)
有效吗?如果是,什么是
s
one(s)
有效吗?您能告诉我们有关
X
的更多详细信息吗?
whosx
返回什么?@carandraugh我添加了一些细节。@WarrenWeckesser我添加了一些细节
size(X)
返回
[512]
。值得一提的是,加法不仅抛出神秘的错误,而且还抛出
1*X例如。您的第二个代码块可以正常工作,但会在my
X
中生成相同的错误。在将
X
保存到文件并重新加载后,即使没有重新启动倍频程,我也不会再出现神秘的错误,一切都很好。@marczellm我只能猜测给你的mex肯定做了一些非常奇怪的事情。没有消息来源来找出它是什么,猜测就没有什么意义。我的最后一个想法是检查
typeinfo(X)
class(X)
返回的内容。然后比较保存和加载后的输出。
typeinfo(X)='matrix'
class(X)='double'
保存和加载前后的输出。不知道。谢谢大家的帮助,有了这个临时文件的想法,我终于可以工作了。@marczellm那些看起来很标准,没有什么不寻常的。我不认为这是八度音阶的错误。我会要求查看C代码或向编写它的人寻求帮助。如果这是奇怪的行为,mex文件可能返回了一些东西,但仍然是错误的。出于您自己的兴趣,请确保在Matlab和Octave中调用mex函数时,
X
确实是相同的。如果答案解决了您的问题,请将其标记为正确。