我在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