2010-07-19 74 views
2

我正在使用矢量容器來存儲雙精度數組。有沒有什麼快速的方法來將我的向量中的每個元素乘以某個標量而不使用循環。執行矢量運算

例如:

vector<double> Array(10,1); 

將初始化的10個雙打初始值1的數組要乘以此 陣列由0.5我會寫:

for(unsigned int i=0; i<Array.size(); i++) 
    Array[i] = 0.5*Array[i]; 

是否有有另一種方式?我已經使用的valarray其重載「*」操作 使:

 Array = 0.5 * Array; 

是有效的,但因爲它似乎向量容器是用來操作數組更 標準的方法,我寧可不使用的valarray。

謝謝!

回答

10

你可以這樣做:

std::transform(Array.begin(), Array.end(), Array.begin(), 
       std::bind2nd(std::multiplies<double>(), 0.5)); 

爲了應對越來越元素的總和:

double sum = std::accumulate(Array.begin(), Array.end(), 0.0); 

並因應越來越sqrt「荷蘭國際集團的每個元素:

std::transform(Array.begin(), Array.end(), Array.begin(), 
       static_cast<double (*)(double)>(std::sqrt)); 

該演員是選擇正確的過載。

+0

謝謝,我假設有一個函數來獲得向量中元素的總和? – Wawel100 2010-07-19 13:20:56

+1

@ Wawel100:是的,我添加了它。如果您發現答案可以解決您的問題,請點擊它上面的複選標記。 – GManNickG 2010-07-19 17:28:14

+0

謝謝!只是最後一個問題:我將如何使用transform來獲取每個元素的sqrt根? – Wawel100 2010-07-20 10:01:19

0

因爲我知道沒有。

如果有一個,可能它爲你封裝了這個循環。所以我不認爲這個表現會改變。

1

您可以使用std ::變換:

std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5))); 
+0

不會是一個由stl隱藏的循環嗎? – sum1stolemyname 2010-07-19 11:34:19

+2

當然。你覺得valarray做什麼? – 2010-07-19 11:54:38

1

STL的載體本身不允許的elementwise縮放在一個單一的操作。

你可以使用應用縮放因子的裝飾器來包裝你的矢量。無論矢量的大小如何,新因子的應用都是O(1)。這不是免費的,因爲缺點是增加了複雜性,並且每個元素的訪問有所增大。

0

考慮使用std::valarray,因爲這是更合適的選擇。

標準庫提供各種各樣的容器是有原因的。它允許開發者使用「馬匹進行課程」。

std::vector是最簡單的容器,因此是許多情況下的最佳選擇。但是,對於特定情況,其他容器類型的附加功能可能會使該類型成爲更好的選擇。這可能是一種這樣的情況,其中陣列成員的數值處理由std::valarray更好地處理。

+1

他的確在他不想問的問題上說過。 :) – GManNickG 2010-07-20 20:21:04

+0

我已經擴大了答案,以解決評論中提出的有效批評。 – 2012-11-15 01:14:40