2014-06-13 117 views
5

有人可以解釋爲什麼在例子A中的結果是1x6向量(這是有道理的,是我期待的),而在例子B中結果是1x4向量?索引到向量

在示例B中,如果我預先定義newvec的大小爲1x6向量,那麼結果是正確的1x6向量。只是不理解發生了什麼。

實施例A

vec = [0 2 3 0 5 0]  %1x6 
newvec(vec == 0) = 1 %produces a 1 x 6 vector 

實施例B

vec = [0 2 3 0 5 3]  %1 x 6 
newvec(vec == 0) = 1 %produces a 1 x 4 vector 
+0

您的示例沒有意義。請爲您遇到的問題添加正確的代碼。你添加的代碼總是給出一個1x6的矢量 – ASantosRibeiro

+1

@ASantosRibeiro:如果你在每個例子之前發出'clear newvec',則不是這樣:) –

+1

+1有趣的問題。答案讓你知道發生了什麼,但只是添加一些東西。如果在工作空間中沒有矢量,並且通過分配類似'A(5)= 1'的方式創建它(以前不存在'A'​​),則matlab將創建一個足以放置'1在第五個元素中,用零填充其餘元素。嘗試一下。你也可以用這種方式擴展一個矩陣,例如'x = 1:5; x(10)= 1',試試&你應該看到它用零填充元素6-9。我想你可以用類似的方式來思考你的問題,你告訴matlab分配到位置1和4,所以它停在4 – Dan

回答

3

編輯: 感謝Dan用於指出該錯誤。

vec == 0產生邏輯矩陣。 現在如果newvec的大小未定義那麼newvec(vec==0) =1將始終創建一個新的行向量 newvec。當您預定義的newvec的大小,然後newvec(v==0) = 1不能改變的newvec大小

下面的步驟將決定這個newvec

temp1 = logical_matrix(:); 
trailing_zeros = number of zeros after the occurrence of last `true` value in temp1 
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ; 

大小,它只分配1到相應的指數,其vec==0true

+3

「將創建一個向量newvec,其大小等於邏輯矩陣中真(one)值的數量」not true,newvec將是邏輯矩陣中最後一個「真」值位置的大小,而不是「真實」值的數量。 – Dan

+2

*「......其大小將等於邏輯矩陣中的真(一個)值的數量,在這種情況下爲4」*,現在不是這樣嗎?因爲例A中'newvec'的大小是1×6,而原來的'vec'中只有3個'trues'。 'newvec'的大小取決於* last *'true'的位置,這很奇怪。 –

+0

@Nishant:我一直注意到你有時會在你的答案和評論中用你的MATLAB語法出錯。建議您實際使用MATLAB,並在下次輸入答案之前將輸出回顯到屏幕上。這樣你就不會誤導OP以及其他閱讀你答案的人。 – rayryeng

4

爲什麼,我們永遠不會知道。這是The MathWorks的設計選擇,恕我直言,它確實違反了principle of least surprise

它聽起來有點premature optimization(根據RAM的使用情況)和/或MATLAB的內部在分配之前撥打find或類似的東西。但是真的有人猜測。

更常見的方式做你想做的,是這樣的:

newvec = (vec == 0); 
4

如果newvec當你調用第二行不存在,MATLAB只是使它大,因爲它需要保持指標你設置爲1

你實際上做的是:

newvec([1 4 6]) = 1;

newvec([1 4]) = 1;

同樣,如果vec實際上是一個2D/3D等矩陣,newvec會出來爲1 x N,其中N是無論最高索引號是多少,並且不保留原始矩陣的形狀。

因此,在這些情況下,您需要:

1)預分配newvec是的vec第一大小。

2)是否newvec = (vec==0)改爲