2014-02-23 89 views
0

我有以下階代碼:轉換這個階代碼以C++

val gates = varNode.getGates() 
val inMsgs = gates.map(g => g.getEndGate.getMessage()) 
val variableMarginal = inMsgs.reduceLeft((msg1, msg2) => msg1 * msg2) 

這是在C以下++(假設我們知道的種類和使用的底層C++容器是一個向量)相同的?

std::vector<Gate *> gates = varNode.getGates(); 
// Assume that the first gate always has a valid message 
double marginal = gates[0]->getEndGate()->getMessage(); 
for (int i = 1; i < gates.size(); ++i) 
    marginal *= gates[i]->getEndGate()->getMessage(); 

我對reduceLeft函數感到困惑。無法理解它的作用。

[編輯]類被定義爲柵如下:

sealed abstract class Gate(initialMsg: SingleFactor) { 

type END_GATE <: Gate 

private var endGate: Option[END_GATE] = None 

private var message: SingleFactor = initialMsg 
private var oldMessage: SingleFactor = initialMsg 
def setEndGate(gate: END_GATE) { endGate = Some(gate) } 
def getEndGate(): END_GATE = endGate.get 

def setMessage(newMessage: SingleFactor, msgIndex: Long) { 
    oldMessage = message 
    message = newMessage 
} 
def getMsgIndex(): Long = msgIndex 
def getMessage(): SingleFactor = message 
def getOldMessage(): SingleFactor = oldMessage 
} 
+0

很難說不知道,什麼'Gate'實際上是...... –

+0

對不起。現在添加Gate抽象類定義。具體的對象只是覆蓋一些東西 – Luca

回答

2

至於我可以看到你需要SingleFactor的執行情況,並知道它是*操作不超載,那麼你就可以推斷出什麼reduceLeft正在做。

我假設inMsgs是映射操作完成後SingleFactor元素的向量(通過.getMessage())。

reduceLeft將獲取第一個SingleFactor,並對第二個SingleFactor使用*運算符,結果會再次對第三個SingleFactor等使用*運算符,從而產生一個將存儲在變量Margin中的值。

爲reduceLeft的一些示例用法你能看懂:http://alvinalexander.com/scala/scala-reduceleft-examples

來診斷一下減少在做,你也可以改變reduceLeft調用是這樣的:(假設你能夠執行你給出的斯卡拉代碼)

# the semicolons are not needed but are added in case you copy paste/single line the code 
val variableMarginal = inMsgs.reduceLeft((msg1, msg2) => { 
    val result = msg1 * msg2; 
    println("msg1: "+ msg1 + " msg2: "+ msg2 + " result: "+result); 
    result }) 

我想你可以「模仿」 ++的reduceLeft用C與累加(API可以在這裏找到:http://en.cppreference.com/w/cpp/algorithm/accumulate) 在這種情況下,您提供BinaryOperation這是一樣SingleFactor的Scala的*操作。