[英]Is there an equivalent of Python's list and append feature in Matlab?
這是一個Matlab編程問題而不是數學問題。
我想在不同的學習率下運行梯度下降倍數。 我有一套學習率
alpha = [0.3, 0.1, 0.03, 0.01, 0.003, 0.001];
每次我運行梯度下降時,我得到一個矢量J_vals
作為輸出。 但是,我不太了解Matlab,除了做類似的事情之外,還知道如何實現這個:
[theta, J_vals] = gradientDescent(...., alpha(1),...);
J1 = J_vals;
[theta, J_vals] = gradientDescent(...., alpha(2),...);
J2 = J_vals;
等等。
我想過使用for循環,但后來我不知道如何處理J_vals
(不知道如何將for循環應用於J1
, J2
等)。 也許它看起來像這樣:
for i = len(alpha)
[theta, J_vals] = gradientDescent(..., alpha(i),...);
J(i) = J_vals;
end
然后我會有一個矢量矢量。
在Python中,我只是運行for循環並將每個新結果附加到列表的末尾。 我如何在Matlab中實現這樣的東西? 還是有更有效的方法?
如果你知道你將要有多少循環和J_vals
的大小(或至少是一個合理的上限)我建議預先分配容器數組的大小
J = zeros(n,1);
然后在每個循環上插入新值
J(start:start+n) = J_vals
這樣你就不會重新分配內存。 如果您不知道,可以將值附加到數組中。 例如,
J = []; % initialize
for i = len(alpha)
[theta, J_vals] = gradientDescent(..., alpha(i),...);
J = [J; J_vals]; % Append column row
end
但這是每個循環重新分配數組的大小。 如果它不是太多循環那么它應該沒問題。
Matlab的“單元陣列”有點像Python中的列表。 它們的相似之處在於您可以將變量數據類型放入其中。 似乎沒有人太確定,但很可能單元格數組是作為對象指針數組實現的。 這意味着追加它仍然有些昂貴( cell_array{length(cell_array) + 1} = new_data
),但至少你只是追加一個指針而不是整個列。 之后,您仍然必須使用cell2mat將單元格數組轉換為普通矩陣。
最慣用的Matlab解決方案是預分配(如建議的@dpmcmlxxvi)。
我認為你所描述的是一個非常常見的用例,不幸的是Matlab需要這樣一個冗長的習慣用法。 同樣令人沮喪的是,文檔對於如何實現單元陣列以及附加到單元陣列是否昂貴是不透明的。
只要為行下標添加:
假設J_vals
是列向量),您的解決方案就可以正常工作:
for i = len(alpha)
[theta, J_vals] = gradientDescent(..., alpha(i),...);
J(:, i) = J_vals;
%// ^... all rows, column 'i'
end
您甚至可以將其作為返回值:
for i = len(alpha)
[theta, J(:, i)] = gradientDescent(..., alpha(i),...);
%// ^... add returned value directly to our list
end
這兩種方法都允許您預先分配矩陣以獲得潛在的速度增益。
如果你想要隨時建立你的列表,你可以使用@ dpmcmlxxvi的答案中的方法,或者你可以使用特殊的下標end
。 但是,這些方法都不與預分配兼容。
for i = len(alpha)
[theta, J(:, end+1)] = gradientDescent(..., alpha(i),...);
%// ^... add new vector after the current end of list
end
我還建議你不要在Matlab中使用i
作為變量名。 我知道這對其他語言來說很自然,但在Matlab中它會覆蓋內置的虛數常量i
。
請參閱: https : //stackoverflow.com/a/14790765/1377097
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.