Matlab двойное сравнение - PullRequest
       21

Matlab двойное сравнение

6 голосов
/ 22 января 2012

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

Редактировать: значения в массиве генерируются путем итеративного сложения или вычитанияпостоянного двойного (например, 0.2).Поэтому модуль этого массива на 0.2 должен быть везде равен 0.Фактически, модуль каждого элемента равен либо 0, либо 0.2, как показано ниже для приведенной выше последовательности чисел в массиве:

mod(array,0.2)
...
0.2000
     0
0.2000
0.2000
     0

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

Ответы [ 3 ]

6 голосов
/ 22 января 2012

Причина в том, что MATLAB усекает числа в массиве, чтобы сохранить только 4 цифры после десятичной точки при отображении.То есть реальное значение вашего массива может быть [10.600000000001, -10.99999999999, ...].Вы правы, это связано с внутренним представлением чисел с плавающей точкой в ​​компьютере, что может привести к крошечным ошибкам в вычислениях.

Лично я думаю, что есть два решения: одно - это приблизительное соответствие, как вы, а другое - сначала округлить массив (скажем, с помощью этого инструмента из FileExchange), а затемсделать точное соответствие.

2 голосов
/ 22 января 2012

Возможно, что-то где-то с одинарной точностью, а где-то вдвое больше Двоичное представление, например, 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      
1 голос
/ 23 сентября 2012

Создайте файл функций 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тоже ...

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

...