Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:删除矩阵中的重复数字_C++_Coordinates - Fatal编程技术网

C++ C++;:删除矩阵中的重复数字

C++ C++;:删除矩阵中的重复数字,c++,coordinates,C++,Coordinates,我想从一个矩阵中删除数字,该矩阵表示格式为“x y z”的坐标。一个例子: 1.211 1.647 1.041 2.144 2.684 1.548 1.657 2.245 1.021 1.657 0.984 2.347 2.154 0.347 2.472 1.211 1.647 1.041 在本例中,坐标1和6是相同的(x、y和z是相同的),我想删除它们,但我不想删除只有一个值等于坐标3和4的情况(对于x坐标) 这些值在一个文本文件中,我希望打印坐标而不在另一个文件中,甚至在同一个文

我想从一个矩阵中删除数字,该矩阵表示格式为“x y z”的坐标。一个例子:

1.211 1.647 1.041

2.144 2.684 1.548

1.657 2.245 1.021

1.657 0.984 2.347

2.154 0.347 2.472

1.211 1.647 1.041
在本例中,坐标1和6是相同的(x、y和z是相同的),我想删除它们,但我不想删除只有一个值等于坐标3和4的情况(对于x坐标)


这些值在一个文本文件中,我希望打印坐标而不在另一个文件中,甚至在同一个文件中重复。

一个非常简单的解决方案是将每一行视为一个字符串,并使用一组字符串。在逐行遍历文件时,检查集合中是否存在当前行,如果不存在,则插入并打印该行。 复杂性:O(nlogn),需要额外的内存:在最坏的情况下几乎与输入文件相同

使用与上一个解决方案相同的复杂性和最坏情况下的内存消耗,您可以在内存中加载文件,按行排序,然后在打印时轻松跳过重复项。如果允许您对文件进行重新排序,也可以在文件内部执行同样的操作,这样您只需要很少的额外内存,但速度要慢得多


如果内存和存储是一个问题(我假设您无法复制该文件),那么可以使用一种简单的方法,在打印之前将当前行与之前的所有行进行比较,复杂度为O(n^2),但没有额外的内存。但是,这是一个相当糟糕的解决方案,因为您必须从文件中读取多次,这与主内存相比可能非常慢。

如果您想保留顺序,如何执行此操作

  • 将坐标读入如下结构数组

    struct Coord
    { 
      double x,y,z; 
      int pos;
      bool deleted;
    };
    
    pos是行号,deleted设置为false

  • 按显示最大变化的轴对结构进行排序

  • 在数组中运行,比较在排序中从上一项使用的轴的值与当前项中的值。如果差值小于某个预设增量(即,如果您关心小数点后的三位数字,您将查找0.00099999左右的差值),则比较剩余值,并为x、y、z足够接近的任何行设置“删除”

    for(int i=1;i<count;i++)
    {
      if(fabs(arr[i].x-arr[i-1].x)<0.001)
        if(fabs(arr[i].y-arr[i-1].y)<0.001)
          if(fabs(arr[i].z-arr[i-1].z)<0.001)
            arr[i].deleted=true;
    }
    

    <代码> >(int i=1;i C++),可以使用STL的电源来解决这个问题。使用并存储三个坐标x,y和z作为键在地图中。映射到密钥的值将存储该密钥的计数。< /p>
    Key_type = pair<pair<float,float>,float>
    mapped_type = int
    
    Key\u type=pair
    映射类型=int
    
    创建一个具有上述给定键类型和映射类型的映射m,并将所有行插入映射中,更新每行的计数。假设n是总行数

    for(i = 0; i < n; i++) {
            m[make_pair(make_pair(x,y),z)]++;
    }
    
    (i=0;i{ m[make_pair(make_pair(x,y,z)]++; }
    每次插入都需要O(logn),您必须插入n次。因此,总体时间复杂度将为O(nlogn).现在,再次循环遍历矩阵的所有行,如果该行的映射_值为1,则该行是唯一的。

    请小心浮点数和相等性测试…除了@Jubobs comment之外,我建议删除在L^2范数中距该点给定距离内的点。允许您操纵坐标的顺序吗nates,例如,通过对它们进行排序?它们是否保证始终是10以下的三个数字,小数点后有三位数字?我给Erik和Jubobs一个+1。作为输出,您希望只有前五行?您只想删除重复的坐标?