2015-04-06 104 views
1

在Matlab中,我想用其他值替換某個值。通過邏輯索引給數組賦值不起作用

我知道我能做到這一點:

X(X==0) = -1 

如果我想替換0所有出現的1

我有一個包含範圍介於0到9的數字陣列X。我想創建一個新的數組Y,其中Y的第i個值是1,如果X(i)==給定數字,比如5,否則爲-1。所以我寫了一個代碼:

Y = (X == 5); 
Y(Y==0) = -1; 

第一行工作正常。它將'5'的所有單元格投影到1,否則爲0,因爲它是邏輯運算。然後,如果它是0,我想用-1替換它,但第二行以某種方式使數組的所有值都變爲1.有沒有人知道爲什麼會發生?謝謝!

回答

3

爲什麼你的方法不工作確實有點古怪。其原因是,你的公式的左邊是完全合乎邏輯的,右手邊是鑄造邏輯,以及和

logical(-1) = 1 

因此:

Y = (X == 5) %// Y is logical 
Y(Y == 0) = -1 %// Y is logical, Y == 0 is logical, 
       %// -1 is casted to logical and logical(-1) = 1 

因此改變你的第一個邏輯陣列的兩倍,它的工作原理。

Y = (X == 5) %// Y is logical 
Y = double(Y) %// Y is double 
Y(Y == 0) = -1 %// Y is double, Y == 0 is logical 

例子:

X = randi(9,20,1); 
Y = (X == 5) 
Y = double(Y) 
Y(Y == 0) = -1 
out = [X Y] 

out = 

    7 -1 
    3 -1 
    5  1 
    7 -1 
    9 -1 
    9 -1 
    5  1 
    2 -1 
    2 -1 
    3 -1 
    8 -1 
    3 -1 
    8 -1 
    3 -1 
    9 -1 
    4 -1 
    2 -1 
    3 -1 
    6 -1 
    5  1 
+0

@beaker那並不是事情 – thewaywewalk

+0

是啊,只是想通了這一點... :) – beaker

+0

我覺得之所以原始方法不起作用的是:當'Y'是'邏輯'數組時,將一個非0或1的值賦給它的一些條目不會使它成爲'雙';它仍然是「邏輯」的。因此,除了'0'之外的所有內容都被轉換爲邏輯「1」('true'),並且'0'被轉換爲邏輯'0'('false')。試試這個例子:'y = true,y(1)= -1' –