Я нахожусь в обсуждении с кем-то от ре MathWorks: unwrap
функция, которая имеет "ошибку" в нем для допусков перехода кроме π и хотела бы получить некоторые другие перспективы:
Описание
Q = unwrap(P)
исправляет фазовые углы радиана в векторе P путем добавления кратных чисел ±2π, когда переходы в абсолютных адресах между последовательными элементами P больше, чем или равны допуску перехода по умолчанию π радианов. Если P является матрицей, разверните, работает по столбцам. Если P является многомерным массивом, разверните, воздействует на первый неодноэлементный размер.
Q = unwrap(P,tol)
использует допуск перехода tol вместо значения по умолчанию, π.
Существует две возможных интерпретации документации:
Q = unwrap(P,tol)
исправляет фазовые углы радиана в векторе P путем добавления кратных чисел ±2π, когда переходы в абсолютных адресах между последовательными элементами P больше, чем или равны tol радианам. Если P является матрицей, разверните, работает по столбцам. Если P является многомерным массивом, разверните, воздействует на первый неодноэлементный размер.
Пример:
>> x = mod(0:20:200,100); unwrap(x, 50)
ans =
0 20.0000 40.0000 60.0000 80.0000 81.6814 101.6814 121.6814 141.6814 161.6814 163.3628
Q = unwrap(P,tol)
исправляет элементы в векторе P путем добавления кратных чисел ±2*tol, когда переходы в абсолютных адресах между последовательными элементами P больше, чем или равны tol. Если P является матрицей, разверните, работает по столбцам. Если P является многомерным массивом, разверните, воздействует на первый неодноэлементный размер.
Пример:
>> x = mod(0:20:200,100); unwrap(x, 50)
ans =
0 20 40 60 80 100 120 140 160 180 200
Фактическое поведение unwrap()
в MATLAB (по крайней мере, до R2010a) № 1. Моя интерпретация unwrap()
это, это, как предполагается, № 2, и поэтому в поведении существует ошибка. Если unwrap()
поведение соответствовало № 2, затем разверните, мог использоваться в качестве инверсии для модификации для медленно переменных исходных данных, т.е. unwrap(mod(x,T),T/2) = x
для векторов x, где последовательные элементы варьируются меньше, чем tol=T/2.
Обратите внимание, что эта 2-я интерпретация является более общей, чем углы и может развернуть что-либо со всеобъемлющим периодом T. (ли значение по умолчанию T=2π для радианов, 360 для градусов, 256 для 8-разрядных чисел, 65536 для 16-разрядных чисел, и т.д.)
Таким образом, мой вопрос:
Есть ли возможные применения для поведения № 1? Какая интерпретация имеет больше смысла?
Поведение №1 имеет смысл, поскольку предполагается, что на входе радиан , а не градусов . Регулировка добавляет пи / 2, если вы превышаете допуск на скачок, так что это нормально.
Было бы неплохо, если бы в unwrap была функция, позволяющая работать с любыми сериями, а не только с радианными углами.
Допуск на скачок недостаточен, чтобы определить, есть ли у вас ряд в радианах, градусах или любом другом виде, поэтому потребуется дополнительный ввод.
Я всегда предполагал, что второе поведение является фактическим, но никогда не проверял его. Буквальное прочтение файла справки действительно указывает на поведение №1. Но это совсем не то, что хотелось бы сделать. В качестве простого примера, рассмотрим разворачивание в градусах
x = mod(0:30:720, 360)
y = unwrap(x,180)
очевидно, что вы хотели бы получить y = 0:30:720, но вместо этого вы получаете ...
y =
Columns 1 through 7
0 30.0000 60.0000 90.0000 120.0000 150.0000 180.0000
Columns 8 through 14
210.0000 240.0000 270.0000 300.0000 330.0000 333.0088 363.0088
Columns 15 through 21
393.0088 423.0088 453.0088 483.0088 513.0088 543.0088 573.0088
Columns 22 through 25
603.0088 633.0088 663.0088 666.0176
что неправильно (y больше не соответствует тому же углу, что и x, что является точкой разворачивания)
Кто-нибудь может привести пример, когда вам нужно поведение #1 (текущее поведение?)
.