Числовое сравнение сложности в R

У меня есть сценарий, который я хотел бы рассказать, где бы я хотел сделать то, что спрашивает Алексей. В плагине Maya C ++ я должен сделать следующий синаниган, чтобы получить значение в атрибуте узла:

MFnDoubleArrayData myArrayData;
MObject myArrayObj = myArrayData.create(myArray);   
MPlug myPlug = myNode.findPlug(attributeName);
myPlug.setValue(myArrayObj);

Это утомительно писать, поэтому я написал следующие вспомогательные функции:

MPlug operator | (MFnDependencyNode& node, MObject& attribute){
    MStatus status;
    MPlug returnValue = node.findPlug(attribute, &status);
    return returnValue;
}

void operator << (MPlug& plug, MDoubleArray& doubleArray){
    MStatus status;
    MFnDoubleArrayData doubleArrayData;
    MObject doubleArrayObject = doubleArrayData.create(doubleArray, &status);
    status = plug.setValue(doubleArrayObject);
}

И теперь я могу написать код с начала сообщения как:

(myNode | attributeName) << myArray;

Проблема в том, что он не компилируется вне Visual C ++, потому что он пытается привязать временную переменную, возвращенную из | оператора к ссылке MPlug & lt; оператор. Я бы хотел, чтобы это была ссылка, потому что этот код вызывается много раз, и я бы предпочел не копировать MPlug. Мне нужен только временный объект для жизни до конца второй функции.

Ну, это мой сценарий. Просто подумал, что я приведу пример, где хочется сделать то, что описывает Алексей. Я приветствую все критические замечания и предложения!

Спасибо.

38
задан GSee 28 November 2012 в 22:03
поделиться

5 ответов

Я никогда не был поклонником all.equal для подобных вещей. Мне кажется, что толерантность иногда работает загадочным образом. Почему бы просто не проверить что-то большее, чем допуск меньше 0,05

tol = 1e-5

(a-b) >= (0.05-tol)

В общем, без округления и с помощью обычной логики я считаю, что прямая логика лучше, чем all.equal

Если x == y , то xy == 0 . Возможно, xy не совсем 0, поэтому для таких случаев я использую

abs(x-y) <= tol

Вы все равно должны установить допуск для all.equal , и это более компактно и просто, чем all. равно .

39
ответ дан 26 November 2019 в 23:49
поделиться

Вы можете создать это как отдельный оператор или переписать оригинальную функцию >= (вероятно, это не очень хорошая идея), если вы хотите часто использовать этот подход:

# using a tolerance
epsilon <- 1e-10 # set this as a global setting
`%>=%` <- function(x, y) (x + epsilon > y)

# as a new operator with the original approach
`%>=%` <- function(x, y) (all.equal(x, y)==TRUE | (x > y))

# overwriting R's version (not advised)
`>=` <- function(x, y) (isTRUE(all.equal(x, y)) | (x > y))

> (a-b) >= 0.5
[1] TRUE
> c(1,3,5) >= 2:4
[1] FALSE FALSE  TRUE
12
ответ дан 26 November 2019 в 23:49
поделиться

Для полноты картины я отмечу, что в определенных ситуациях вы можете просто округлить до нескольких десятичных знаков (и это своего рода неудачное решение по сравнению с лучшее решение, опубликованное ранее.)

round(0.58 - 0.08, 2) == 0.5
9
ответ дан 26 November 2019 в 23:49
поделиться

Выберите уровень допуска:

epsilon <- 1e-10

Затем используйте

(a-b+epsilon) >= 0.5
3
ответ дан 26 November 2019 в 23:49
поделиться

Но, если вы все равно используете допуски, почему вас волнует, что a-b == .5 (фактически) не оценивается? Если вы все равно используете допуски, вы говорите, что меня не волнуют точные конечные точки.

Вот что верно if ((ab)> = .5) if ((ab) <.5)

один из них всегда должен оценивать true для каждой пары парных. Любой код, который использует один неявно, по крайней мере, определяет операцию no для другого. Если вы используете допуски, чтобы получить фактический .5, включенный в первый, но ваша проблема определяется в непрерывной области, вы не добьетесь многого. В большинстве проблем, связанных с непрерывными значениями в основной задаче, в этом будет очень мало смысла, поскольку значения, произвольно превышающие 0,5, всегда будут оцениваться так, как должны. Значения, произвольно близкие к 0,5, перейдут к «неправильному» управлению потоком, но в непрерывных задачах, где вы используете соответствующую точность, это не имеет значения.

Допуски имеют смысл только тогда, когда вы имеете дело с проблемами типа if ((ab) == c) if ((ab)! = C)

Здесь вам не поможет никакая «соответствующая точность». Причина в том, что вы должны быть готовы к тому, что второе значение всегда будет истинным, если вы не установите биты a-b на очень низкий уровень вручную, хотя на самом деле вы, вероятно, хотите, чтобы первое иногда было истинным.

2
ответ дан 26 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: