Подразделение MATLAB... должно ли 29/128 возвращать 0?

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

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

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

val =

   29

bucketSize =

   128

pos =

   0

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

4 ответа

Решение

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

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

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

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

Пытаться:

double(val)/double(bucketSize)

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

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

Другие вопросы по тегам