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