应用在不同点采样的加权函数

计算科学 八度
2021-12-11 01:49:55

我有一组数据,我想对其应用加权函数,所以基本上是一个简单的乘法。

我的采样数据如下所示:

采样数据

(对于那些感兴趣的人,这是一个 LED 的相对发光强度)

加权函数也只能以表格形式使用,如下所示:

加权函数

(这是标准的亮度函数,可能有其他格式,但我有另一个权重不是)

碰巧的是,这些点在 X 轴上并不重合,所以我不能只是将这些值相乘,而是必须对加权函数进行一些插值,以获得采样点的“正确”加权因子数据。

我想知道是否已经有一个可用于 Octave 的函数/包来处理 Y 值的乘法和 X 值的插值。

由于我不是母语人士,主要研究电气工程问题,所以我的正确关键字词汇量很快就用完了。实现这一点可能并不难,但我尽量不要一遍又一遍地重新发明轮子。

1个回答

我以粗略的方式实现了这一点(我不经常使用 Octave 或 Matlab,所以我不习惯向量和矩阵数据类型以及如何充分利用它们)。

该函数接受 X 轴值,需要一个加权矩阵,其中第一列包含 x 值,第二列包含加权因子。如果提供的 X 轴值超出加权矩阵的范围,它还需要选择两个标准值。

它返回加权因子的线性插值,或者如果加权矩阵格式错误(一个 x 点的多个条目),则返回较大的加权因子。

这太可怕了,没有检查,除了我以外的每个人都可能失败。也许这是其他人的起点。

function retval = Weighting ( x, weightingMatrix, weightingBelowMinimum, weightingAboveMaximum)

if (x < weightingMatrix(1,1))
  retval = weightingBelowMinimum;
elseif ( x > weightingMatrix(size(weightingMatrix,1),1))
  retval = weightingAboveMaximum;
else
  smallerWeightIndex = 0;
  biggerWeightIndex = 0;
  for i=1:size(weightingMatrix,1)
    if (x<weightingMatrix(i,1))
      biggerWeightIndex = i;
      smallerWeightIndex = i-1;
      break;
    endif
  endfor


  if (weightingMatrix(biggerWeightIndex,2)==weightingMatrix(smallerWeightIndex,2))
    retval = weightingMatrix(biggerWeightIndex,2);
  elseif (weightingMatrix(biggerWeightIndex,1)==weightingMatrix(smallerWeightIndex,1))
    retval = max(weightingMatrix(biggerWeightIndex,2),weightingMatrix(smallerWeightIndex,2));
  else
    m = (weightingMatrix(biggerWeightIndex,2)-weightingMatrix(smallerWeightIndex,2))/(weightingMatrix(biggerWeightIndex,1)-weightingMatrix(smallerWeightIndex,1));
    c = weightingMatrix(biggerWeightIndex,2)-(m*weightingMatrix(biggerWeightIndex,1));
    retval = m*x+c;
  endif
endif


endfunction