2013-02-03 77 views
5

取代我在MATLAB两个矩阵,减去在MATLAB两个矩阵,在结果的负值由零

> 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 

欲减去这两个矩阵逐元素和得到的结果;例如对于第一个元素(183 - 201 = -18),但此元素的输出为零。结果如下:

> 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 

我怎么能保持真实的结果呢?没有在我的结果矩阵

回答

6

运行下面的示例代码获得零底片:

%# 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; 

对于给定的样本运行:

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 

同时:

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 

你会注意到A中的所有负数已被0替换,而n B中的编号正确显示。

简单地说:如果您使用的数字格式不能存储负数,那么Matlab将截断为0.解决方案是转换为能够容纳“实数”(或近似值)的格式),例如double,或者在您的情况下,int格式中的一个格式可能更合适,例如int8,int16,int32int64

0

我不为你得到了同样的问题:我有这样的代码:

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 

和我得到这个输出:

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 

检查所创建的矩阵被正确创建(作为双打而不是无符号整数)。

+0

我怀疑的问题是,OP是使用无符号的数据格式,需要将其转换为加倍。看到我的答案更详细... –

+0

@ColinTBowers是的,我还补充说,他需要检查创建时他的类型。尽管你的答案看起来好多了。 –

+0

啊,我只是在发表我的评论后才看到您的修改。感谢您的验证。 –

2

另一种选择是在一个行减法使用singledouble如下:

ans=double(IRwindow-ILwindow) 
+0

我认为这会引发错误,因为'mtimes'不能将无符号整数与逻辑点相乘。另外,我不确定这是否能解决问题,因为输出仍然会有“零”元素应该出现的零。或者我误解了? –

+0

是的,我误解了这个问题......会编辑答案 – bla