2017-04-07 35 views
2

我是Matlab的新手。我想在python中找到一種方式來遍歷某些值。如何迭代某個值?

在蟒蛇,它希望它這樣的事情:

for i in [0, 90, 180, 360]: 
    print('degree', i) 

但是,如何做到這一點在Matlab?

回答

2

短版:

這樣做:

myvar = [0, 90, 180, 360]; 
for i = 1:size(myvar, 2) 
    ival = myvar(:, i); 
    disp(['degree', num2str(ival)]); 
end 

龍版本:

MATLAB沒有任何與Python迭代器等價的東西。它的循環規則是根本不同的。

您的代碼將實際工作MATLAB大致爲用Python編寫的:

for i = [0, 90, 180, 360] 
    disp(['degree', num2str(i)]); 
end 

然而,那是因爲這是在MATLAB中的特殊情況,通過巧合,恰好有類似的結果的一個在Python中。但是MATLAB正在做一些非常不同的事情,所以看起來相似的代碼在Python中將會默默地在MATLAB中做一個完全不同的事情。

Python的循環規則依賴於迭代器協議,迭代器類如列表和numpy數組。通常,它在「外部」序列上循環。在嵌套列表中,它是最外層的列表。在numpy數組中,它是最後一個維度。

MATLAB的循環規則如下:如果它有兩個以上的維度,則將矩陣變平整爲一個二維矩陣,然後在第二維上循環。換句話說,循環變量已經被平化爲二維矩陣之後,通過循環的第二次循環向您提供了循環變量的列列。所以在你的情況下,你有一個二維矩陣,其中第一維是1,第二維是4。所以它循環遍歷第二個維度,爲您提供矩陣(在MATLAB中沒有像Python中的1D或0D數據類型那樣的東西)。

但是,如果你有一列向量,就像這樣:

for i = [0; 90; 180; 360] 
    disp(['degree', num2str(i)]); 
end 

你會得到一個錯誤:

Error using horzcat 
Dimensions of matrices being concatenated are not consistent 

...因爲不是得到4個1x1矩陣您將獲得1 4x1矩陣,因爲原始矩陣是4x1矩陣,因此具有第二維1。如果您從4x5矩陣開始,您將得到5 4x1矩陣。如果以4x5x6矩陣開頭,則會得到30(5*64x1矩陣。

而且,它總是返回你有在相同的數據類型。所以如果你開始一個1x4單元陣列,你會得到1x1電池陣列出來的,而不是無論是單元陣列中。因此,直接使用單元陣列也沒有多大意義。

總體而言,這是什麼意思是,直接在循環中使用的變量,像這樣:

for i = myvar 
    % do something 
end 

...在MATLAB極其危險的。這隻能可靠地運行,如果你可以絕對100%肯定myvar始終是一個行向量。但是,如果你試圖擴展代碼,或者在新的情況下使用它,它可以默默地做錯誤的事情。並且對其他MATLAB內部特性和函數做出默默做錯的事情,這種代碼似乎很容易工作,會給你一個完全錯誤的結果。

所以你很少在MATLAB中看到這種方法,人們通常做的就是使用索引變量。他們在循環中創建一系列索引並循環遍歷這些索引。通常的做法是這樣的

myvar = [0, 90, 180, 360]; 
for i = 1:length(myvar) 
    ivar = myvar(i); 
end 

因此,在這種情況下i是您要使用的myvar索引。這種方法雖然很普遍,但也很危險。不同於numpy其中len總是給出一致的維度(第一個),MATLAB中的length會給出最長的維度,無論這可能是什麼。所以如果給出二維矩陣,它會發生不可預測的變化。而且,由於MATLAB將單個索引作爲矩陣的扁平版本的索引,它將再次默默地做錯誤的事情。

所以這樣做的唯一可靠的方法就是手動指定要使用size功能維度,或者如果你要循環多維數組中的所有值使用numel函數來獲取元素的總數:

for i=1:size(myvar, 2) 
    ivar = myvar(:, i); 
end 

for i=1:numel(myvar) 
    ivar = myvar(i); 
end 
-1
for i = [0, 90, 180, 360] 
    fprintf('degree %d\n', i) 
end 

顯示:

degree 0 
degree 90 
degree 180 
degree 360 
+0

這隻會在OP的具體示例中起作用,但它不適用於迭代問題所要求的值的一般情況。在Python中,OP的例子不是特例,但在MATLAB中是這樣。 – TheBlackCat