Матлаб двойное сравнение

я пытаюсь сравнить массив двойников со скалярным двойником для равенства, но равенство никогда не признается при определенных обстоятельствах. Я подозреваю, что это связано с тем, как представлен двойной (например, 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 0s получилась.

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...

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