【问题标题】:How to check if variable is Scalar or Array before mxIsScalar was introduced?在引入 mxIsScalar 之前如何检查变量是标量还是数组?
【发布时间】:2015-07-27 13:28:49
【问题描述】:

在 Matlab 的 mex 文件中,有一个函数 mxIsScalar 可以告诉您 mex 文件的输入是否是标量。但该功能已在 R2015a 中引入。

如果使用以前版本的 Matlab(在我的情况下是 2014b,如果这很重要),检查输入是标量还是数组的最优雅的方法是什么?

我需要将mxGetNumberOfDimensionsmxGetDimensionsmxIsNumeric 组合起来吗?或者还有其他clearsimple的方法吗?我更喜欢可读性而不是速度。

【问题讨论】:

  • 我不确定这一点,但印象是sizeof 可以做到这一点。有什么理由不适合这里(sizeof(vec)/sizeof(vec[0]))?
  • @patrik 它可能会成功。不是经验丰富的 C 代码编写者,所以对此一无所知。我想这与vec 的正确类型无关?在这种情况下,它们将是 mxArray 类型。
  • 我认为sizeof 适用于任何类型,但正如我所说,我并不完全确定。你可以试试看是否成功。
  • mathworks.com/help/releases/R2014b/matlab/matlab_external/… 有一个示例,它检查标量值。 mxGetM 和 mxGetN 应该适用于任何类型。如果您期望超过 2-D,您可能还需要检查维度数。
  • @Navan 我看不到那个例子...许可证激活关联错误(虽然我在大学使用的是完整版的 Matlab,所以我应该有任何许可证)。

标签: c matlab mex


【解决方案1】:

除了mxGetMmxGetN,还有mxGetNumberOfElements,你可以这样使用:

bool const isScalar = (size_t(1) == mxGetNumberOfElements(prhs[0]));

【讨论】:

  • 太棒了。虽然这个答案只适用于标量,但另一个可以检查任何维度,所以我觉得它更完整。但是对于只有标量/非标量的情况非常非常好!
  • @AnderBiguri 我认为这个答案更适合仅检查标量(即没有mxIsScalar)。考虑一个m-by-n-by-p 数组。 mxGetN 会报告n*p,不是很清楚。使用mxGetNumberOfElements 不会混淆问题。
【解决方案2】:
mrows = mxGetM(prhs[0]);
ncols = mxGetN(prhs[0]); 

if (mrows==1 && ncols==1) {
 // Scalar prhs[0] here
}

请注意,如果 prhs[0] 有超过 2 个维度,例如 N,则 mxGetN 是维度 2 ... N 的乘积的结果。mxGetM 将始终返回第一个维度。对于稀疏矩阵,这可能不是一个很好的检查,因为这些矩阵可能不会返回矩阵中元素的实际数量。

可以在 http://www.mathworks.com/help/matlab/matlab_external/passing-a-scalar_btgcjh1-1.html 找到完整的 mex 文件示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2010-12-19
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多