【问题标题】:Addition fails in Octave with MEX file使用 MEX 文件在 Octave 中添加失败
【发布时间】:2014-03-31 15:27:54
【问题描述】:

最初为 MATLAB 编写的软件库(包括 MATLAB 和 C 源文件)正在移植到 Octave。 C 代码使用 MATLAB MEX 文件接口。该库在 MATLAB 上可以正常工作,但在 Octave 上却不行。 C 源代码已关闭,我无法访问它,但有人为我编译了它。

以下八度代码

Y=ones(size(X)) + X;

因错误而失败

下标索引必须是正整数或逻辑数。

X 是 MEX 模块返回的矩阵。

我已经验证onessize 指的是内置函数,而不是被某些局部变量覆盖。

我该如何解决这个问题?

编辑 分解为步骤:

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

【问题讨论】:

  • 首先找出导致错误的部分。 s = size(X) 有效吗?如果是这样,s 是什么? ones(s) 有效吗?
  • 你能告诉我们更多关于X的细节吗? whos X 返回什么?
  • @carandraug 我添加了一些细节。
  • @WarrenWeckesser 我添加了一些细节。 size(X) 返回[512 512]

标签: octave mex


【解决方案1】:

您报告的错误没有理由。我无法弄清楚它可能在做什么。如果我生成您报告的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;

【讨论】:

  • 可能值得一提的是,不仅添加会引发神秘错误,例如1*X;。您的第二个代码块可以正常工作,但与我的X 生成相同的错误。将X 保存到文件并重新加载后,即使没有重新启动 Octave,我也不会再收到任何神秘错误,一切都很好。
  • @marczellm 我只能猜测给你的 mex 一定是在做一些非常奇怪的事情。没有来源找出它是什么,猜测没有多大意义。我的最后一个想法是检查 typeinfo (X)class (X) 返回的内容。然后在保存和加载之后比较这些的输出。
  • typeinfo(X)=='matrix'class(X)=='double' 在保存和加载之前和之后。不知道。感谢所有的帮助,有了这个临时文件的想法,我终于可以工作了。
  • @marczellm 这些看起来真的很标准,没什么特别的。我认为这不是 Octave 中的错误。我会要求查看 C 代码或向编写它的人寻求帮助。如果这表现得很奇怪,则 mex 文件可能会返回一些内容但仍然是错误的。为了您自己的利益,请确保 X 在 Matlab 和 Octave 中调用 mex 函数时确实是相同的。如果答案解决了您的问题,请将其标记为正确。
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2014-03-24
相关资源
最近更新 更多