Матлаб двойное сравнение
я пытаюсь сравнить массив двойников со скалярным двойником для равенства, но равенство никогда не признается при определенных обстоятельствах. Я подозреваю, что это связано с тем, как представлен двойной (например, 1.0 vs 1.00), но я не могу понять это.
например, я создал массив, состоящий из тысяч двойных значений, последние несколько из которых в какой-то момент времени задаются
10.6000
-11.0000
10.2000
22.6000
3.4000
если я проверяю равенство до 10.2 (или 10.2000) по команде array==10.2
(или array=10.2000
), Я возвращаю массив 0s. Если я помещаю значения, показанные в массив вручную (например,array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
), то команда выполнена успешно (т. е. array==10.2
возвращает 0 0 1 0 0
). Может ли кто-нибудь объяснить, почему равенство успешно, если я ввожу значения вручную, но терпит неудачу, если массив генерируется в контексте программы? Я могу исправить ошибку сравнения, используя приблизительное, а не точное сравнение (например,(array<10.20001) & (array>10.19999)
), но это кажется неудовлетворяющий.
Edit: значения в массиве генерируются путем итеративного сложения или вычитания константы double (например,0.2
). Модуль этого массива по 0.2
поэтому должны быть везде равны 0
. Фактически, модуль каждого элемента равен либо 0
или 0.2
, как показано ниже для приведенной выше последовательности чисел в массиве:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
опять же, если значения помещены в массив вручную и модуль взят, то ожидаемое значение all 0
s получилась.
3 ответов
причина в том, что MATLAB усек числа в массиве, чтобы сохранить только 4 цифры после десятичной точки при отображении. То есть реальное значение вашего массива может быть [10.600000000001, -10.99999999999, ...]
. Вы правы, это связано с внутренним представлением чисел с плавающей запятой в компьютере, что может вызвать крошечные ошибки в вычислениях.
лично я думаю, что есть два решения, одно из которых является приблизительным соответствием, как и вы, а другое-сначала округлить массив (скажем, с инструмент from FileExchange), а затем выполните точное сопоставление.
что-то, вероятно, в одной точности где-то, и удвоить в другом месте. Двоичное представление, например, 10.2 в каждом, отличается, поскольку они заканчиваются после другого количества бит. Таким образом, они различны:
>> if (single(10.2) == 10.2) disp('honk'); end
>> if (single(10.2) == single(10.2)) disp('honk'); end
honk
вам нужно будет проверить равенство в пределах некоторой небольшой разницы:
eps = 0.001;
result = abs(array-10.2) < eps;
вы можете найти точность, используемую в массиве, используя whos:
>> whos A
Name Size Bytes Class Attributes
A 1x2 8 single
создайте файл функции MATLAB, который будет принимать значения по модулю (от 3 до 9; то есть от Z3 до Z9) и выведет наименьшее возможное значение, описываемое условиями по модулю.
Пример Моделирования:
Z = [ 3 4 5]; % по модулю Z3, Z4 и Z5
r = [ 2 1 4]; % остаточные значения
наименьшее возможное значение-29.
входы Z должны быть матрицей массива ... где в вы можете ввести любое число от 3 до 9 .... и вы можете ввести 3,4,5,6,7,8,9 в любом порядке, в любых парах или группах ...
входы r также должны быть равны количеству входов Z...
выход должен давать наименьшее возможное значение, хотя условия по модулю...