2017-08-18 60 views
1

我無法理解我剛發現的Matlab的行爲。下面是代碼:邏輯索引創建行而不是列

ix = logical([1; 0; 1]); 
value = [2; 2; 2]; 
newValue(ix) = value(ix) 

它輸出

​​

,而我希望

2 
0 
2 

我的代碼之前添加newValue = nan(size(value))我可以「糾正」了。但我想了解爲什麼 Matlab從列向量創建一行。

+0

我不知道爲什麼,但是你可以用'newValue(ix,:) = value(ix)'(如果'newValue'不存在,否則你應該像初始化那樣初始化它)得到預期的結果。 – Zep

+0

@Zep,問題在於我希望函數的輸出具有與輸入相同的維度(例如,使用內置的「sin」)。然而,沒有預分配,它不起作用,如上所述。而且它不起作用的事實表明我在Matlab中缺少一些關於尺寸的基礎知識。所以它困惑我,從第一個原則:) – texnic

+0

我認爲@ThéoP.回答你:默認情況下Matlab創建行。如果你想要一個列,可以預先分配或在索引中指定它('newValue(ix,:)')。 – Zep

回答

2

我不認爲它與邏輯索引有任何關係。您可以重現相同的行爲與

ix=[1;2;3] 
value = [2; 2; 2]; 
newValue(ix)=value(ix) 

newValue = 

2  2  2 

我假設默認格式(NEWVALUE)是行,這就是爲什麼你得到這個結果(因爲你可以看到,如果你創建X = 1:3)。

x=1:3; 
x = 

1  2  3 

通過預先分配newValue,您可以克服這一點。

newValue=zeros(size(value)); 

或後處理它

newValue=newValue(:); 
4

,因爲當你創建一個使用索引數組它做此行爲:a(1) = 2; a(2) = 3;,MATLAB(和八度)創建一個行(a=[2, 3])。當你使用邏輯索引時,它使用這種方法。在你的情況Matlab的執行

newValue(1) = value(1); 
newValue(3) = value(3); 

但作爲@Irreducible說,你可以通過分配預NEWVALUE

避免這一點,你可以得到相同的結果,而無需使用邏輯與索引:

ix = [1; 0; 1]; 
value = [2; 2; 2]; 
newValue = value.*ix; 
相關問題