Эквивалент функции поиска Matlab для массивов C - PullRequest
1 голос
/ 20 сентября 2011

Мне нужен эквивалент функции Matlab find ( ссылка ) в C для массивов:

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
   }
}

Теперь я не могу понятьиспользуйте контейнеры Boost или C ++, например vector, из-за ограничений проекта.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Это должно сделать что-то близкое к тому, что вы хотите - возвращает количество ненулевых элементов, которые он поместил в 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;
}
1 голос
/ 20 сентября 2011

Если вы ограничены «vanilla C» (что, по-вашему, так и есть), ничего подобного встроенному нет, вы должны написать собственную версию такой функции.

Ноиз того, что я вижу из вашего примера, вам нужно нечто отличное от функции find, вы хотите найти элементы, отличающиеся на x и y.Если вы стремитесь к гибкости, было бы неплохо написать обобщенную функцию, которая проверяет данный предикат (передаваемый как указатель на функцию) на два массива.С другой стороны, поскольку в C мы имеем только функциональные указатели (а не функторы), производительность может пострадать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...