2013-06-05 21 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; 
    }); 
} 
相關問題