我有一個關於冒號操作符和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
零向量?
我有一個關於冒號操作符和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
零向量?
每當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的情況下,這些不同的變量指標到一個不存在的陣列,這需要「用一些東西填充洞」,以使其成爲一個有效的,一致的陣列。
這是否使事情清楚?
當您定義a(1:2:5)
時,它會創建一個大小爲5的矢量(零值),並選擇奇數索引(其中3個存在)單元格。 1:-4:-7
創建三個值(不是五個)。最後的選擇了三個單元填充有從未來3個值的數據1:-4:-7
好的,所以我必須小心比較'a(1:2:5)'和'1:-4:-7'。第一個表達式創建五個元素,第二個創建三個元素,將三個元素組合在矢量「a」的奇數空格/元素上時打印出來。感謝您的幫助,您有什麼建議可以在哪裏找到關於我的問題的更多信息?當我在網上搜索時,我找不到相關信息。感謝您的支持! – johnhenning
如果您認爲它解決了您的問題,請接受此答案。 1:2:5實際上創建了3個值,如果您僅在MATLAB命令行中編寫,則訣竅在於如果將它用於索引矢量(1:2:5),則它可以像創建5個元素一樣工作並選擇其中3個。 –
非常全面的答案,非常感謝! – johnhenning