2013-02-03 30 views
5

Tôi có hai ma trận trong matlab,trừ hai ma trận trong matlab, các giá trị tiêu cực trong kết quả được thay thế bằng zero

> IRwindow = 
> 
> **183** 171 150 125 137 
    138 167 184 173 152 
    105 114 141 167 185 
    148 113 105 115 141 
    186 183 147 112 105 
> 
> ILwindow = 
> 
> **201** 170 165 177 203 
    181 174 167 169 189 
    154 150 156 168 181 
    187 175 158 131 144 
    173 186 183 167 141 

Tôi muốn trừ hai ma trận các yếu tố khôn ngoan và nhận được kết quả; ví dụ cho phần tử đầu tiên (183 - 201 = -18) NHƯNG đầu ra cho phần tử này cho không. kết quả kết quả sẽ như sau:

> IRwindow - ILwindow 

ans = 

    **0** 1 0 0 0 
    0 0 17 4 0 
    0 0 0 0 4 
    0 0 0 0 0  
    13 0 0 0 0 

làm cách nào để giữ kết quả thực? mà không nhận được số không cho tiêu cực trong tôi kết quả ma trận

Trả lời

6

Run mã ví dụ sau:

%# Create random matrices 
X = randi(100, 5, 5); 
Y = randi(100, 5, 5); 

%# Convert to strictly non-negative format 
X = uint8(X); 
Y = uint8(Y); 

%# Perform subtractions 
A = X - Y; 

%# Convert to double format 
X = double(X); 
Y = double(Y); 

%# Perform subtraction 
B = X - Y; 

Đối với một chạy mẫu đưa ra:

A = 

    0 15 36 0 0 
    0 0 0 0 3 
    0 0 0 25 0 
    13 0 15 0 0 
    0 49 0 0 14 

khi:

B = 

    -8 15 36 -4 -65 
    0 -47 -45 -11  3 
    -18 -17 -11 25 -52 
    13 -53 15 -15 -1 
    -35 49 -47 -8 14 

Bạn sẽ nhận thấy rằng tất cả các số âm trong A đã được thay thế bằng 0, trong khi số egative trong B được hiển thị chính xác.

Nói một cách đơn giản: nếu bạn sử dụng định dạng số không thể lưu trữ số âm, thì Matlab cắt bớt tại 0. Giải pháp là chuyển đổi sang định dạng có thể chứa số "thực" (hoặc xấp xỉ gần đúng) trong số đó) chẳng hạn như double hoặc có thể trong trường hợp của bạn, một trong các định dạng int có thể phù hợp hơn, chẳng hạn như int8, int16, int32 hoặc int64.

0

Tôi chưa nhận được cùng một vấn đề như bạn: Tôi có mã này:

IRwindow = [ 

183 171 150 125 137 
138 167 184 173 152 
105 114 141 167 185 
148 113 105 115 141 
186 183 147 112 105] 

ILwindow = [ 

201 170 165 177 203 
181 174 167 169 189 
154 150 156 168 181 
187 175 158 131 144 
173 186 183 167 141] 


IRwindow - ILwindow 

và tôi nhận được kết quả này:

IRwindow = 

    183 171 150 125 137 
    138 167 184 173 152 
    105 114 141 167 185 
    148 113 105 115 141 
    186 183 147 112 105 


ILwindow = 

    201 170 165 177 203 
    181 174 167 169 189 
    154 150 156 168 181 
    187 175 158 131 144 
    173 186 183 167 141 


ans = 

    -18  1 -15 -52 -66 
    -43 -7 17  4 -37 
    -49 -36 -15 -1  4 
    -39 -62 -53 -16 -3 
    13 -3 -36 -55 -36 

Kiểm tra xem bạn đang tạo ma trận của bạn đang được tạo đúng (gấp đôi và không phải là số nguyên không dấu).

+0

tôi nghi ngờ vấn đề là OP đang sử dụng một định dạng dữ liệu unsigned và cần phải chuyển đổi nó sẽ tăng gấp đôi. Xem câu trả lời của tôi để biết thêm chi tiết ... –

+0

@ColinTBowers Yep, tôi cũng đã thêm rằng anh ấy cần kiểm tra loại của mình khi tạo. Câu trả lời của bạn trông đẹp hơn rất nhiều. –

+0

Ah, tôi chỉ nhìn thấy bản chỉnh sửa của bạn sau khi đăng bình luận của tôi. Cảm ơn bạn đã xác thực. –

2

Một lựa chọn khác là sử dụng single hoặc double trên trừ trong một dòng như sau:

ans=double(IRwindow-ILwindow) 
+0

Tôi nghĩ rằng điều này sẽ ném một lỗi vì 'mtimes' không thể chấm các số nguyên không dấu với logic. Ngoài ra, tôi không chắc chắn điều này giải quyết vấn đề, như đầu ra vẫn sẽ có số không, nơi các yếu tố "tiêu cực" nên được. Hoặc có lẽ tôi đã hiểu lầm? –

+0

vâng, tôi hiểu nhầm câu hỏi ... sẽ chỉnh sửa câu trả lời – bla

Các vấn đề liên quan