【问题标题】:Equivalent of Matlab find function for C arrays等效于 C 数组的 Matlab 查找函数
【发布时间】:2011-09-20 11:47:54
【问题描述】:

我需要在 C 中使用 Matlab find 函数 (reference) 来处理数组:

ind = find(X) 定位数组 X 的所有非零元素,并返回 向量 ind 中这些元素的线性索引。如果 X 是行向量, 那么 ind 是一个行向量;否则, ind 是列向量。如果 X 不包含非零元素或为空数组,则 ind 是 空数组。

一个简单的未经测试的例子:

#include <stdlib.h>
#include <time.h>
int main()
{
   /* Initialize variables */
   int x[25];
   int y[25];

   /* initialize random seed: */
   srand ( time(NULL) );

   /* Fill arrays with stuff */
   for (i=0;i<25;i++)
   {
      x[i] = rand();
      y[i] = rand();
   }

   /* Find */
   ind = find((x-y) > 0); // Need to figure out how to do this
   }
}

现在问题是由于项目限制,我不能使用像 vector 这样的 Boost 或 C++ 容器。

【问题讨论】:

  • 我猜你得自己动手了。
  • @Dima,这是我最初的猜测,希望 Stack Exchange 能证明我错了。
  • @Dorgan,这就是为什么它是微不足道的,也是我快速编写未经测试的东西的原因:p
  • 只是一个跛脚的聪明人——别介意我在这里。我会继续删除我的评论...
  • 这只是一个简单的for 循环,你可以写100次,比来这里寻找它花费的时间更少! :))

标签: c search matlab


【解决方案1】:

如果您仅限于“vanilla C”(从您的问题来看似乎是这种情况),则没有内置的类似功能,您必须编写自己的此类函数版本。

但是根据我从您的示例中看到的情况,您需要与 find 函数不同的东西,您希望找到与 xy 不同的元素。如果您追求灵活性,最好编写一个通用函数来检查两个数组上的给定谓词(作为函数指针传递)。另一方面,由于在 C 中我们只有函数指针(而不是函子),因此性能可能会受到影响。

【讨论】:

    【解决方案2】:

    这应该做一些接近你想要的事情 - 返回它为你放置在 outArray 中的非零元素的数量。不完全相同的调用签名,但应该做你想做的事。未经测试:)

    size_t find(int *inArray, int *outArray, size_t arraySize)
    {
      size_t numElements = 0;
      for(int i=0; i<arraySize; i++)
      {
        if(inArray[i])
        {
           outArray[numElements++] = inArray[i];
        }
      }
    
      return numElements;
    }
    

    【讨论】:

    • 我将使用size_t 表示arraySizenumElementsfind 的返回类型。
    • @MichaelDorgan:如果我们想为outArray 预先分配空间,最坏的情况是使用与原始inArray 一样大的数组。如果不对输入数组进行两次传递,我们如何才能节省空间?
    • 我们已经需要知道原件有多大才能存在。只需在创建新尺寸时使用该尺寸即可。
    • @Armo,您的编辑具体是什么?它看起来和我一模一样,但显示出一些变化......
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2012-02-21
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多