2011-03-07 71 views
8

我有定義爲設置所有非零矩陣元素爲1(同時保持其他0)

[X, Y, Z] = meshgrid(-100:100, -100:100, 25); % z will have more values later 

和兩個形狀的網狀網格(橢圓形,在這種情況下):

x_offset_1 = 40; 
x_offset_2 = -x_offset_1; 
o1 = ((X-x_offset_1).^2./(2*Z).^2+Y.^2./Z.^2 <= 1); 
o2 = ((X-x_offset_2).^2./(2*Z).^2+Y.^2./Z.^2 <= 1); 

現在,我想找到所有非零的點,在或者是橢圓形。我試圖

union = o1+o2; 

但因爲我簡單地添加它們時,重疊區域將具有的2而不是所希望1.

如何可以在基質中設置所有非零項1的值,不管他們以前的價值?

(我試過normalized_union = union./union;,但後來我在所有的0元素結束了NaN因爲我除以零...)

回答

15

簡單的解決方案:A=A~=0;,其中A是你的矩陣。

這只是執行邏輯操作,檢查每個元素是否爲零。因此,如果元素非零,則返回1;如果元素爲零,則返回0

+0

完美,謝謝!你太快了,所以不會讓我把你的答案標記爲接受,直到另外6分鐘:P – 2011-03-07 23:30:31

6

第一個建議:不要使用union作爲變量名,因爲這會影響內置函數union。我建議使用變量名inEitherOval,而不是因爲它是更具描述性的...現在

,你有一個選擇是像做什麼abcd suggests在其中添加您的矩陣o1o2和使用relational not equal to operator

inEitherOval = (o1+o2) ~= 0; 

在同樣一對夫婦的其他可能性使用邏輯not操作者或功能logical

inEitherOval = ~~(o1+o2);  % Double negation 
inEitherOval = logical(o1+o2); % Convert to logical type 

然而,最簡潔的解決方案是直接應用邏輯or操作者o1o2

inEitherOval = o1|o2; 

,這將導致在值1,其中任一矩陣是非零,否則爲零。

+0

'union'就是我在這個問題中提出的 - 在我的實際代碼中,我有變量名稱,它對應於橢圓形代表,所以這不是問題。感謝所有的好建議! – 2011-03-08 17:26:33

2

還有另一個簡單的解決方案,A =邏輯(A)

相關問題