2013-06-05 16 views
0

我在C语言中很新,但是我在matlab中有一些很好的技巧。在matlab中,我可以使用[x,y]=find(matrix==any_value),如果此值存在于矩阵中,它会返回给我大量的xy -indices给定值。在C 2 -D数组中找到一个值的多个索引

我尝试了一些函数作为查找,但我读到的是它只返回矩阵中第一次出现的值的索引。

假设我有一个C的double D的二维数组,其中有一些重复值,我怎么能找到这个矩阵中重复值的xy坐标?

+0

您可以用approriate函数fn用[的for_each(http://www.cplusplus.com/reference/algorithm/for_each/)。 – Kamouth

+0

一些提示:你有没有考虑在''中使用'std :: find'算法?您可以指定一个搜索范围。结合循环时,您可以轻松遍历所有事件。还要注意,由于'C++ 11'还有'std :: find_if'和'std :: find_if_not',它们更通用。您也可以将'std :: find'循环封装到您自己的迭代器中,就像它在boost的'find_iterator'中完成的一样,这更接近您在MATLAB中所做的。 –

+2

这是关于C或C++的问题吗?问题和标题指示C,但标签是C++,似乎提示可能不相关的C++答案... – twalberg

回答

2

在C中,您只能返回一个值。结果是夫妻,你需要不止一个。我会声明一个点结构并填充这些对象的数组;该函数将返回找到的结果数...让你开始,是这样的:

struct point { 
    int x; 
    int y; 
}; 

int find_stuff(int* mat[], int dimX, int dimY, int desired, struct point out[]) 
{ 
    int ret=0; 
    int x, y; 

    for(y=0; y<;dimY; y++) 
     for (x=0; x<dimX; x++) 
      if (mat[y][x] == desired) { 
       out[ret].x = x; 
       out[ret].y = y; 
       ret++; 
      } 

    return ret; 
} 

void test_the_function(int* mat[], int dimX, int dimY, int desired) 
{ 
    struct point results[100]; 
    int i,n; 

    n = find_stuff(mat, dimX, dimY, desired, results); 

    for (i=0; i<n; i++) 
     printf("%i\t(%i, %i)\n", i, results[i].x, results[i].y); 
} 
+0

这有点静态,但OP说他是C新手,所以至少是领先的。 – Djon

+0

Exceptyon,我在你的代码中需要的是矩阵out []和int ret,我可以在find_stuff函数中返回它们两个吗? – mad

+0

@mad:在一个函数中只返回一个值(通常返回一个数组通常不是一个好主意)......除了填充数组并返回最终长度之外别无选择 – Exceptyon

1

你必须写自己的功能,因为C没有寻找元素内置功能。 该函数在找到第一个实例后不会“中断”,但会一直持续到列表的末尾。

保留一个空白的索引数组。 indices[] 每当您找到该元素时,将其推入该索引数组中。 在函数结束时,您将所有索引整齐地存储在x,y坐标(或索引)的数组中。

1

你可以这样说:

#include <vector> 
#include <utility> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    const double val = 3.14; 
    double a[100][100]; 
    /* ... initialize a somehow ... */ 
    vector<pair<int,int>> pos; 

    for (int x = 0; x < 100; ++x) 
     for (int y = 0; y < 100; ++y) 
      if (a[x][y] == val) 
       pos.push_back(make_pair(x,y)); 

    std::for_each(v.begin(), v.end(), [](pair<int,int> p){ 
     cout << '(' << p.first << ',' << ')' << endl; 
    }); 
} 
相关问题