2010-09-11 8 views
6

Tôi thực sự không nghĩ rằng đây là một vấn đề chính xác, câu trả lời sẽ là khoảng 0.226. Đây là mã chính xác:Phân chia MATLAB ... nên 29/128 trả về 0?

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

I chỉ là ma trận mà tôi lấy giá trị từ đó. Đây là kết quả đầu ra từ MATLAB:

val = 

    29 

bucketSize = 

    128 

pos = 

    0 

Tôi đang thiếu gì?

Trả lời

16

Tôi đoán rằng ma trận của bạn I là dữ liệu pixel được tải từ image file, sẽ có giá trị thường là unsigned 8-bit integers. Như đã đề cập, chuyển đổi cả hai giá trị số nguyên thành giá trị double precision sẽ đảm bảo rằng MATLAB thực hiện phân chia dấu phẩy động thay vì phân chia số nguyên (sẽ làm tròn kết quả).

Chuyển đổi một giá trị để double precision đủ:

Đối với tất cả các hoạt động nhị phân trong đó một toán hạng là một mảng số nguyên kiểu dữ liệu (trừ số nguyên 64-bit) và người kia là một đại lượng vô hướng đôi, MATLAB tính toán hoạt động bằng cách sử dụng số nguyên tố chính xác hai chiều , và sau đó chuyển kết quả trở về số nguyên gốc loại dữ liệu.

Nếu bạn muốn tìm hiểu thêm về các loại dữ liệu số khác nhau trong MATLAB, bạn có thể xem this documentation.

0

Các biến này có thể là int thay vì gấp đôi hoặc dài. Có 1/2 trở lại .5? Các hoạt động khác có hoạt động không?

+0

Có. Ví dụ, 29/128 kết quả trong câu trả lời đúng. Tôi đã được ấn tượng Matlab là không có kiểu chữ? Làm cách nào để đặt các biến số tăng gấp đôi? – jakev

10

thử:

double(val)/double(bucketSize) 
+0

điều này cũng đã hoạt động, cảm ơn – jakev

1

tôi đã nhận nó, vấn đề là ma trận của tôi đối với một số lý do chứa của uint8, không đánh đôi. Chỉ cần thay đổi val = I (i, j) thành val = double (I (i, j)) và tất cả đều tốt. Cảm ơn.