Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 用相邻数组的平均值替换数组的一部分_Arrays_Matlab_Average - Fatal编程技术网

Arrays 用相邻数组的平均值替换数组的一部分

Arrays 用相邻数组的平均值替换数组的一部分,arrays,matlab,average,Arrays,Matlab,Average,我在工作区中创建了此变量: z= 0.000894000000000000 -0.000929000000000000 0.00101500000000000 0.000747000000000000 0.00103900000000000 0.000888000000000000 0.000828000000000000 0.000737000000000000 0.000858000000000000 -0.000723000000000000 0.0008740000

我在工作区中创建了此变量:

z=

0.000894000000000000

-0.000929000000000000

0.00101500000000000

0.000747000000000000

0.00103900000000000

0.000888000000000000

0.000828000000000000

0.000737000000000000

0.000858000000000000

-0.000723000000000000

0.000874000000000000
我想写一段代码,用这个数字正上方和下方的数字的平均值来替换负数。

试试这个:

for index = 1 : length( z )
    if ( z( index ) < 0 ) // FIXED
        above = max( index, 1 );
        below = min( index, length( z ) );
        z( index ) = mean( z( above ), z( below ) ); // FIXED
    end
end
索引=1的
长度(z)
if(z(索引)<0)//固定
以上=最大值(指数,1);
以下=最小值(指数,长度(z));
z(指数)=平均值(z(高于),z(低于));//固定的
结束
结束
但这并不完全正确。在下列情况下应如何处理:

  • 正如在“Ĭnfernal Seraphím”的问题上,当邻居也持否定态度时
  • 如果有第一项和最后一项是否定的

您可以从线性插值的角度来处理此问题。假设
z
中没有连续的负数,可以使用以下方法执行此操作:

这也可以处理在开始和结束时都有负值的情况,并且
extrap
标志只是外推。如果开头和结尾的值都是负值,我不确定这是否是您想要的,但我将留给您去弄清楚

然而,这种方法背后的美妙之处在于,我们提供了控制点,这些控制点在
z
中从1点到尽可能多的点。这些是
x
点。输出
y
点是
z
中的值。但是,我们删除了那些为负值的控制点-对
z
也一样

接下来,我们在
z
中指定从1到尽可能多的元素的全谱关键点,以实现最终输出。在这种情况下,使用线性插值可以有效地找到由负数分隔的两点之间的平均值

但是,如果有连续的负数,那么我们将看到在负数链开始之前为正值的值,以及在负数链之后为正值的值,在连续的负数链之间,这些值被平滑地插值。我不确定这是否是你想要的,所以我把它留在这里让你去弄清楚

这是我们得到的输出:

>> format long g;
>> out

out =

              0.000894
             0.0009545
              0.001015
              0.000747
              0.001039
              0.000888
              0.000828
              0.000737
              0.000858
              0.000866
              0.000874

或者,您可以使用,但前提是:

此代码使用以下假设:

  • z
    开头和结尾没有负数
  • z
    中没有连续的负数
  • 因此:

    %// Find negative values in z
    ind = find(z < 0);
    
    %// Replace each negative value with the
    %// average of the values above and below each negative
    z(ind) = (z(ind-1) + z(ind+1)) / 2;
    

    不是最有效的方法,但是

    av = conv(z, [.5 0 .5], 'same');  %// compute average for all elements
    ind = z<0;                        %// determine which are negative
    z(ind) = av(ind);                 %// replace those only
    
    av=conv(z,[.50.5],'same');%//计算所有元素的平均值
    
    ind=Z如何处理连续序列中有多个负数的情况?另外,如果第一个元素和/或最后一个元素为负数,会发生什么情况?那么处理方法是什么?我们有人回答你的问题吗?我打错了。我会搞定的,再来一条评论<上面的代码>和下面的代码>实际上什么都不做。它基本上等于
    索引
    。你的意思是将
    over
    设为
    over=max(索引-1,1)
    以下
    以下=最小值(索引+1,长度(z))?仍然是一种有效的方法:)此外,可能需要指定外推参数,以说明当结束元素为负时的情况(我建议这里的
    “最近的”
    外推算法)可能是最好的方法@BenVoigt-正确。让我改变我的帖子。@BenVoigt-我假设第一个和最后一个元素不是负数,尽管你有外推的观点。使用
    interp1
    的替代方法很好:)+1
    >> format long g;
    >> z
    
    z =
    
                  0.000894
                 0.0009545
                  0.001015
                  0.000747
                  0.001039
                  0.000888
                  0.000828
                  0.000737
                  0.000858
                  0.000866
                  0.000874
    
    av = conv(z, [.5 0 .5], 'same');  %// compute average for all elements
    ind = z<0;                        %// determine which are negative
    z(ind) = av(ind);                 %// replace those only