我是Matlab的新手。我想在python中找到一種方式來遍歷某些值。如何迭代某個值?
在蟒蛇,它希望它這樣的事情:
for i in [0, 90, 180, 360]:
print('degree', i)
但是,如何做到這一點在Matlab?
我是Matlab的新手。我想在python中找到一種方式來遍歷某些值。如何迭代某個值?
在蟒蛇,它希望它這樣的事情:
for i in [0, 90, 180, 360]:
print('degree', i)
但是,如何做到這一點在Matlab?
短版:
這樣做:
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*6
)4x1
矩陣。
而且,它總是返回你有在相同的數據類型。所以如果你開始一個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
for i = [0, 90, 180, 360]
fprintf('degree %d\n', i)
end
顯示:
degree 0
degree 90
degree 180
degree 360
這隻會在OP的具體示例中起作用,但它不適用於迭代問題所要求的值的一般情況。在Python中,OP的例子不是特例,但在MATLAB中是這樣。 – TheBlackCat