Преобразование этого кода Scala в C ++

0

У меня есть следующий код scala:

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. Не могу понять, что он делает.

[EDIT] Класс Gate определяется следующим образом:

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. Бетонные объекты просто перекрывают некоторые вещи
Теги:

1 ответ

2
Лучший ответ

Насколько я вижу, вам нужна реализация SingleFactor и знать, не перегружен ли оператор *, то вы можете определить, что делает reduceLeft.

Я предполагаю, что inMsgs является вектором элементов SingleFactor (через.getMessage()) после завершения операции карты.

ReduceLeft будет захватывать первый SingleFactor и использовать оператор * для второго SingleFactor, результат которого будет использовать снова оператор * против третьего SingleFactor и т.д., В результате чего одно значение будет сохранено в переменнойMarginal.

для некоторых примеров использования reduceLeft вы можете прочитать это: http://alvinalexander.com/scala/scala-reduceleft-examples

для диагностики того, что делает сокращение, вы также можете изменить вызов reduceLeft на что-то вроде этого: (предполагая, что вы можете выполнить свой данный код Scala)

# 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 })

Я думаю, что вы можете "эмулировать" сокращениеLeft в C++ с накоплением (API можно найти здесь: http://en.cppreference.com/w/cpp/algorithm/accumulate). В этом случае вы предоставляете двоичную операцию, как операция Scala * SingleFactor.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню