Как получить обычную выборочную матрицу в Scilab

Я пытаюсь запрограммировать функцию (или, что еще лучше, она уже существует) в scilab, которая вычисляет регулярные временные выборки значений. IE: У меня есть вектор «значения», который содержит значение сигнала в разное время. Это время находится в векторе «раз». Таким образом, в момент времени (N) сигнал имеет значение value (N). На данный момент время не является регулярным, поэтому переменные «время» и «значения» могут выглядеть так:

times = [0, 2, 6, 8, 14] 
values= [5, 9, 10, 1, 6]

Это означает, что сигнал имел значение 5 от секунды 0 до секунды 2. Значение 9 от секунды 2 до секунды 6 и т. д. Поэтому, если я хочу вычислить среднее значение сигнала, я не могу просто вычислить среднее значение вектора «значения». Это потому, что например сигнал может быть долгое время с одним и тем же значением, но в векторе будет только одно значение. Один из вариантов — взять deltaT для расчета носителя, но мне также нужно будет выполнить другие расчеты: среднее значение и т. д.

Другой вариант — создать функцию, которая с учетом дельтаТ производит выборку векторов времени и значений для создания равноотстоящего вектора времени и соответствующих значений. Например, при deltaT=2 и предыдущих векторах

[sampledTime, sampledValues] = regularSample(times, values, 2)
sampledTime = [0, 2, 4, 6, 8, 10, 12, 14]
sampledValues = [5, 9, 9, 10, 1, 1, 1, 6]

Это легко сделать, если deltaT достаточно мала, чтобы точно соответствовать всем временам. Если deltaT больше, то необходимо сделать среднее значение или какое-то приближение...

Что-нибудь уже сделано в Scilab? Как можно запрограммировать эту функцию?

Большое спасибо! PS: я не знаю, является ли это правильным форумом для размещения вопросов по scilab, поэтому любой указатель также будет полезен.


person MAB    schedule 18.02.2014    source источник


Ответы (1)


Если вы хотите реализовать это самостоятельно, вы можете использовать взвешенную сумму.

times = [0, 2, 6, 8, 14]
values = [5, 9, 10, 1, 6]

weightedSum = 0
highestIndex = length(times)

for i=1:(highestIndex-1)
    // Get the amount of time a certain value contributed
    deltaTime = times(i+1) - times(i);

    // Add the weighted amount to the total weighted sum  
    weightedSum = weightedSum + deltaTime * values(i);
end

totalTimeDelta = times($) - times(1);

average = weightedSum / totalTimeDelta

printf( "Result is %f", average )

Или Если вы хотите использовать функционально тот же, но менее читаемый код

timeDeltas = diff(times)
sum(timeDeltas.*values(1:$-1))/sum(timeDeltas)     
person spoorcc    schedule 19.02.2014