Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
Python 逻辑:在二维数据中查找并删除重复项,并平均y轴结果_Python_C++_C_Matlab - Fatal编程技术网

Python 逻辑:在二维数据中查找并删除重复项,并平均y轴结果

Python 逻辑:在二维数据中查找并删除重复项,并平均y轴结果,python,c++,c,matlab,Python,C++,C,Matlab,这是我在这个论坛上的第一个问题。我在主题行中提到了逻辑,因为我不是在寻找特定的编程语言。如果有人能指出逻辑的问题以及如何在没有任何内置功能的情况下实现它,我将不胜感激 描述:我有一个2d数据,它是一些实验室实验的x轴和y轴值。实际数据要大得多。我假设personfrom字段将数据作为排序列表提供给我。现在我只是在这个例子中简化了它。第一个任务是删除重复项,以便最终结果为x=[1.5,2.4],任务2是合并相应的y值,以便新的y=[10+20/2,30+40/2]=[15,35]。我得到的输出是

这是我在这个论坛上的第一个问题。我在主题行中提到了逻辑,因为我不是在寻找特定的编程语言。如果有人能指出逻辑的问题以及如何在没有任何内置功能的情况下实现它,我将不胜感激

描述:我有一个2d数据,它是一些实验室实验的x轴和y轴值。实际数据要大得多。我假设personfrom字段将数据作为排序列表提供给我。现在我只是在这个例子中简化了它。第一个任务是删除重复项,以便最终结果为x=[1.5,2.4],任务2是合并相应的y值,以便新的y=[10+20/2,30+40/2]=[15,35]。我得到的输出是

z= 1.50000 2.40000 z1= 15 25

所以,问题1:z返回正确的列表,但前提是我有1组重复项。如果列表中的数字重复了两次以上,如[1,1,1,2,2],则此操作失败。 问题2:很明显,我的平均逻辑是错误的

所以,如果你们能指出我错在哪里,如果有更好的方法来解决这个问题,我将不胜感激。多谢各位

clc
x1 = [1.5,1.5,2.4,2.4];
y = [10,20,30,40];

x = sort(x1);

n = length(x);

for i = 1:n
    for j = i+1:n
        if x(j) == x(i)
            for k = j:n-1
                num = 1;
                x(k) = x(k+1);
                Add = y(k-1)+y(k);
                num = num +1;
                y(k-1) = Add/num;
            end
            n = n-1;
            j = j-1;
        else

        end
    end
end

for i=1:n
    z(i) = x(i);
    z1(i) = y(i);
end
z
z1

嗯,让我想想。。。您对x进行了排序,但没有对y进行排序;如果要将它们排序在一起,Matlab有一个sortrows函数,如果x和y组成矩阵的列,它就可以这样做。所以你想先这么做,然后打开包装

现在进入循环逻辑:您希望跟踪到目前为止发现的x的唯一值的数量,以及到目前为止看到的x的当前值的副本数量。在处理第一行之后,您不必询问就知道这两个都将是1。这很好,因为第一个元素与我们的循环结构不匹配,所以我们可以将其从循环中排除

现在,在我们的循环体中,我们首先做的是比较x,席,当前值,与前一个值XI-1。比较浮点值是否相等有点偶然,所以我们在这里尝试了模糊比较

如果它们的比较结果相等,那么我们就没有找到任何唯一的x值,但是当前值的字符串变长了1,所以我们更新了这条信息

如果它们不相等,那么我们已经在上一个唯一值x处完成了运行,因此我们将上一个值x,xi-1放在其在唯一值x中的位置,并对上一个当前值y进行平均,然后将该平均值放在y数组中的相应位置

这样做之后,我们知道我们又发现了一个唯一的x值,当前x值的重复运行从1开始,因此我们更新了唯一和当前的值以反映这些事实。完成后,我们只需完成因x值不足而中止的运行,然后将x和y数组切碎为找到的唯一值的数量

在我看来,对于一个初学编程的人来说,这确实是一项艰巨的任务

% bump.m

x1 = [1.5,2.4,1.5,2.7,1.5];
y1 = [10,30,20,40,50];

A = sortrows([x1' y1'])';

x = A(1,:);
y = A(2,:);

unique = 1;
current = 1;

for i = 2:length(x),
    if abs(x(i)-x(i-1)) < 100*eps(abs(x(i))+abs(x(i-1))),
        current = current+1
    else
        x(unique) = x(i-1);
        y(unique) = sum(y(i-current:i-1))/current;
        unique = unique+1;
        current = 1;
    end
end
x(unique) = x(end);
y(unique) = sum(y(end-current+1:end))/current;
x = x(1:unique)
y = y(1:unique)

首先,欢迎访问stackoverflow.com。请花些时间阅读,特别是命名和。也请和。最后,请学习如何创建。然后,如果您想要一个语言不可知的解决方案,一个算法,那么使用语言不可知和算法标记。不要用不相关的语言标签发送垃圾邮件。如果你想要一个只使用特定语言的解决方案,同样不要用不相关的语言标记发送垃圾邮件。@Someprogrammerdude我为没有遵守该格式而道歉。话虽如此,我相信你对我在这里提出的问题有了很好的理解。它应该很容易用c或fortran验证。我添加标签的原因是,有人会尝试他/她的任何语言选择,这应该作为我的参考。如果这是浪费你或其他人的时间,我再次表示歉意。谢谢。你好,谢谢你抽出时间。我试过这个逻辑。然而,我得到的响应是x=[Matrix]1x5150000 1.50000 1.50000 2.40000270000y=[Matrix]1x51003004050>FWIW,我相信unique是matlab中用于变量赋值的内置函数。我使用的数学工具类似于matlab,具有独特的as功能。因此,我将变量名更改为“典型”。但结果并不是我对矩阵的预期。而且,在处理实际精度时,关于等式的问题,你是对的。我没有在原始代码中共享这些,但是我正在检查作为合并标准的容差。sortrows应该也在八度工作。如果在我的示例的第9行首次定义x和y之后打印出它们,您会得到什么?只需将前9行复制粘贴到八度音阶中,不要尝试重新键入。还可以使用编辑器确保将“唯一”的每个实例更改为“典型”。我的答案中的例子在Matlab中运行得很好,除了B=[xl',yl'];C=sortB; A=C';x=A1,:y=A2,:原因是该商用产品没有内置sortrows。但我检查过矩阵应该和你的一样返回。此外,您的代码以八度工作。但是我不确定为什么替换给定的行而不是sortrows不起作用。我只是对矩阵进行转置,sort函数对每一列进行单独排序,这不是您想要的,而sortrows函数将输入矩阵视为行向量的集合,并仅根据第一列中的值对该集合进行排序,这是您想要的。Matlab还有一个语法[x,I]=sortx1;y=y1I,如果sortrows不可用,则可以保存您的屁股。