2012-08-24 49 views
3

我有一個關於冒號操作符和MATLAB中向量擴展的問題。我的問題是要了解下面的代碼行如何擴展,以便能夠將其用於其他序列。的MATLAB代碼行是:MATLAB中冒號操作的組合

a(1:2:5) = 1:-4:-7 

注意a膨脹之前沒有定義。這將返回矢量

a = 1 0 3 0 -7 

我知道結腸運營商如何與{start}:{step}:{stop},我的問題是瞭解如何以及爲什麼a(1:2:5)1:-4:-7組合返回五行與2位置和5零向量?

回答

1

每當Matlab的檢測你indecing到元素矩陣/陣列的當前界限,它會自動墊用零缺少的元素:

>> clear b; b(10) = 5 
b = 
    0  0  0  0  0  0  0  0  0  5 

這個功能既非常有用,並非常危險。事實上,聲明可以變得非常簡單,比如你自己的情況,這很有用。您可以通過發出類似

myClassArray(500) = myClass(1, 2); 

這就好比

% cannot pre-allocate (zeros() or ones() give double/uint8/..., not myClass) 
for ii = 1:499 
    myClassArray(ii) = myClass; % so, growing array 
end 
myClassArray(500) = myClass(1,2); 

不是一些無限美好創建定製類的整個陣列但是,越來越多陣列可很難發現:

a = zeros(10,1); 
for ii = 1:10 
    a(ii+1) = rand; 
end 

它可以使性能大大降低。另外,當你將Matlab原型的代碼翻譯成像C++這樣的靜態類型語言時,複製這些代碼將導致緩衝區溢出並導致段錯誤。現在

,要回你的情況:

clear a; a(1:2:5) = 1:-4:-7 

1:2:5將擴大到數組[1 3 5]1:-4:-7會給值[1 -3 -7]。由於變量a尚不存在,Matlab將創建一個新變量,並使用值[1 -3 -7]填充元素[1 3 5]。然後爲了初始化變量a(即[2 4])而跳過的索引將自動初始化爲零。

如果你熟悉Python,這是一個有點像語法多個值分配給多個變量

x,y = 1,2 

但在你的Matlab的情況下,這些不同的變量指標到一個不存在的陣列,這需要「用一些東西填充洞」,以使其成爲一個有效的,一致的陣列。

這是否使事情清楚?

+0

非常全面的答案,非常感謝! – johnhenning

1

當您定義a(1:2:5)時,它會創建一個大小爲5的矢量(零值),並選擇奇數索引(其中3個存在)單元格。 1:-4:-7創建三個值(不是五個)。最後的選擇了三個單元填充有從未來3個值的數據1:-4:-7

+0

好的,所以我必須小心比較'a(1:2:5)'和'1:-4:-7'。第一個表達式創建五個元素,第二個創建三個元素,將三個元素組合在矢量「a」的奇數空格/元素上時打印出來。感謝您的幫助,您有什麼建議可以在哪裏找到關於我的問題的更多信息?當我在網上搜索時,我找不到相關信息。感謝您的支持! – johnhenning

+0

如果您認爲它解決了您的問題,請接受此答案。 1:2:5實際上創建了3個值,如果您僅在MATLAB命令行中編寫,則訣竅在於如果將它用於索引矢量(1:2:5),則它可以像創建5個元素一樣工作並選擇其中3個。 –