2012-11-13 48 views
16

我有3列,n行矩陣:應用規範函數矩陣的行 - Matlab的

[ a,b,c; 
    d,e,f; 
    g,h,i; ] 

我想常態函數應用於每一行,並獲得包含規範一個1xn矩陣:

[ norm([a,b,c]); 
    norm([d,e,f]); 
    norm([g,h,i]); ] 

我可以用for循環做到這一點,但有沒有更好的方法?

+2

其實這也是我的問題。在我的情況下,我必須評估其座標在矩陣行中的粒子位置的標準。我通常做的是:'norms = sqrt(A(:,1)。^ 2 + A(:,2)。^ 2 + A(:,3)。^ 2)'。但我強烈懷疑存在一種更聰明的方法;)。 – Acorbe

回答

29

什麼

norms = sqrt(sum(A.^2,1)) 

norms = sqrt(sum(A.^2,2))? 

取決於你的座標是否以行或列。

+2

您的意思是「座標以列或行」。 sum(...,1)將每列累加,sum(...,2)累加到每行。 – Robino

1

如果第一個維度是不是太大:

norms = sqrt(diag(A * A')); 
+2

它在我看來,你總是要面對更大的維度,我的意思是,爲了有用'A * A'必須總是返回一個'n x n'矩陣。不過,這會給你帶來很大的開銷。 – Acorbe

+0

是的,「A * A」的結果是nxn。 – Serg

+1

代碼應該是有趣的閱讀,對吧? :P – Robino

1

如果可讀性是一個更大的代價比的性能,你也可以考慮:

norms = cellfun(@norm,num2cell(A,2)); 

這種模式也適用於沿着一個其他操作您可能希望在MATLAB本身不支持的地方執行維度。