我是 C 的新手,但我在 matlab 方面有一些不错的技能。在 matlab 中,我可以使用它,如果该值存在于矩阵中[x,y]=find(matrix==any_value)
,它会返回给我很多x
和- 给定值的索引。y
我尝试了一些函数作为查找,但我读到的是它只返回矩阵中第一次出现的值的索引。
假设我在 C 中有一个带有一些重复值的 double 二维数组,我怎样才能在这个矩阵中找到重复值的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;
});
}