Подразделение MATLAB ... должно ли 29/128 возвращать 0? - PullRequest
6 голосов
/ 11 сентября 2010

Я действительно не думаю, что это проблема точности, ответ должен быть около 0,226. Вот точный код:

val = I(i,j)
bucketSize    
pos = val / bucketSize

I - это просто матрица, из которой я беру значения. Вот вывод из MATLAB:

val =

   29

bucketSize =

   128

pos =

   0

Что мне не хватает?

Ответы [ 4 ]

16 голосов
/ 11 сентября 2010

Я полагаю, что ваша матрица I представляет собой данные пикселей, загруженные из файла изображения , значения которого обычно равны 8-разрядным целым числам без знака .Как уже упоминалось, преобразование обоих целочисленных значений в значение двойной точности гарантирует, что MATLAB выполняет деление с плавающей запятой вместо целочисленного деления (что округлит результат).

Преобразование одного значения в двойной точности недостаточно:

Для всех двоичных операций, в которых один операнд является массивом целочисленного типа данных (кроме 64-битных целых чисел), а другой - скалярным двойным,MATLAB вычисляет операцию с использованием поэлементной арифметики двойной точности, а затем преобразует результат обратно в исходный целочисленный тип данных.

Если вы хотите узнать больше о различных числовых типах данных в MATLAB эту документацию вы можете .

11 голосов
/ 11 сентября 2010

попробуй:

double(val)/double(bucketSize)
1 голос
/ 11 сентября 2010

Я понял, проблема в том, что моя матрица по какой-то причине содержала uint8, а не удваивается Просто изменил val = I (i, j) на val = double (I (i, j)) и все хорошо. Спасибо.

0 голосов
/ 11 сентября 2010

Эти переменные, скорее всего, целые, а не двойные или длинные. 1/2 возвращает .5? Работают ли другие операции?

...