我在C語言中很新,但是我在matlab中有一些很好的技巧。在matlab中,我可以使用[x,y]=find(matrix==any_value)
,如果此值存在於矩陣中,它會返回給我大量的x
和y
-indices給定值。在C 2 -D數組中找到一個值的多個索引
我嘗試了一些函數作爲查找,但我讀到的是它只返回矩陣中第一次出現的值的索引。
假設我有一個C的double D的二維數組,其中有一些重複值,我怎麼能找到這個矩陣中重複值的x
和y
座標?
我在C語言中很新,但是我在matlab中有一些很好的技巧。在matlab中,我可以使用[x,y]=find(matrix==any_value)
,如果此值存在於矩陣中,它會返回給我大量的x
和y
-indices給定值。在C 2 -D數組中找到一個值的多個索引
我嘗試了一些函數作爲查找,但我讀到的是它只返回矩陣中第一次出現的值的索引。
假設我有一個C的double D的二維數組,其中有一些重複值,我怎麼能找到這個矩陣中重複值的x
和y
座標?
在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);
}
你必須寫自己的功能,因爲C沒有尋找元素內置功能。 該函數在找到第一個實例後不會「中斷」,但會一直持續到列表的末尾。
保留一個空白的索引數組。 indices[]
每當您找到該元素時,將其推入該索引數組中。 在函數結束時,您將所有索引整齊地存儲在x,y座標(或索引)的數組中。
你可以這樣說:
#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;
});
}
您可以用approriate函數fn用[的for_each(http://www.cplusplus.com/reference/algorithm/for_each/)。 – Kamouth
一些提示:你有沒有考慮在''中使用'std :: find'算法?您可以指定一個搜索範圍。結合循環時,您可以輕鬆遍歷所有事件。還要注意,由於'C++ 11'還有'std :: find_if'和'std :: find_if_not',它們更通用。您也可以將'std :: find'循環封裝到您自己的迭代器中,就像它在boost的'find_iterator'中完成的一樣,這更接近您在MATLAB中所做的。 –
這是關於C或C++的問題嗎?問題和標題指示C,但標籤是C++,似乎提示可能不相關的C++答案... – twalberg