我無法理解我剛發現的Matlab的行爲。下面是代碼:邏輯索引創建行而不是列
ix = logical([1; 0; 1]);
value = [2; 2; 2];
newValue(ix) = value(ix)
它輸出
,而我希望
2
0
2
我的代碼之前添加newValue = nan(size(value))
我可以「糾正」了。但我想了解爲什麼 Matlab從列向量創建一行。
我無法理解我剛發現的Matlab的行爲。下面是代碼:邏輯索引創建行而不是列
ix = logical([1; 0; 1]);
value = [2; 2; 2];
newValue(ix) = value(ix)
它輸出
,而我希望
2
0
2
我的代碼之前添加newValue = nan(size(value))
我可以「糾正」了。但我想了解爲什麼 Matlab從列向量創建一行。
我不認爲它與邏輯索引有任何關係。您可以重現相同的行爲與
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(:);
,因爲當你創建一個使用索引數組它做此行爲: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;
我不知道爲什麼,但是你可以用'newValue(ix,:) = value(ix)'(如果'newValue'不存在,否則你應該像初始化那樣初始化它)得到預期的結果。 – Zep
@Zep,問題在於我希望函數的輸出具有與輸入相同的維度(例如,使用內置的「sin」)。然而,沒有預分配,它不起作用,如上所述。而且它不起作用的事實表明我在Matlab中缺少一些關於尺寸的基礎知識。所以它困惑我,從第一個原則:) – texnic
我認爲@ThéoP.回答你:默認情況下Matlab創建行。如果你想要一個列,可以預先分配或在索引中指定它('newValue(ix,:)')。 – Zep