IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Избавление от Boost'a.
Krjuger
сообщение 10.11.2011 21:50
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Уже более практическая часть проблемы.
Есть работающий код с использованием буста.Нужно избавитьс от буста и сохранить работоспособность.
У меня появилась проблема.

vector<double> p(spaceSize);
Negate(GradF(x),p);

void Negate(vector<double> x, vector<double> y)
{
for ( int i=0; i<x.size() ; i++)
y[i]=-x[i];
}


В Negate первый параметр подается правильно, в самом Negate y присваивается правильно,но на выходе p как было нулевым вектором, так и осталось.

Суть в том,что есть градиент некоторой функции,например.

vector<double> GradF1(vector<double> x)
{
vector<double> res(x.size() );
res[0] = 2 * (x[0] - 5) * ( (x[1] - 4) * (x[1] - 4) + 1);
res[1] = 2 * (x[1] - 4) * ( (x[0] - 5) * (x[0] - 5) + 1);
return res;
}

Мне надо переписать отричательный градиент в другую переменную.Размерности совпадают ,тут проблем нет.

А теперь самое главное,если я меняю

vector<double> Negate(vector<double> x)
{
vector<double> res(x.size() );
for ( int i=0; i<x.size() ; i++)
res[i]=-x[i];
return res;
}
.......

for (int i=0;i<x.size();i++)
p[i]=Negate(GradF(x))[i];



То все нормально,и опять таки,если я делаю процедуру Copy

void Copy(vector<double> x, vector<double> y)
{
for ( int i=0; i<x.size() ; i++)
y[i]=x[i];
}


И вызываю ее, как Copy(Negate(GradF(x)),p); то опять таки нифига не работает.Да и, исправив все на циклы в коде, в результате я получил абсолютно идентичный результат,что и с использованием Буста, но данное поведение меня просто убило.В Билдере тоже самое, но он хотябы мне сообщил о делении на ноль,а VS так кушал))

Сообщение отредактировано: Krjuger - 10.11.2011 22:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 10.11.2011 23:11
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Не работает
Не верю...

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

using namespace std;

const int spaceSize = 10;

void Negate(vector<double>& x, vector<double>& y)
{
// transform(x.begin(), x.end(), back_inserter(y), negate<double>());
transform(x.begin(), x.end(), y.begin(), negate<double>());
}


int main()
{
vector<double> one, two;
for(int i = 0; i < spaceSize; i++)
{
one.push_back(2.0 * i);
two.push_back(1.0 * i);
}

Negate(one, two);

copy(two.begin(), two.end(), ostream_iterator<int>(cout, "\n"));
return 0;
}

Компилируется и работает "на ура"...
Онлайн-компилятором тоже

Цитата
Кстати там Negate с большой буквы
"Там" - я не знаю. В Стандарте языка negate с маленькой буквы... Не используй тот неймспейс - не будет конфликтовать...

Цитата
из-за чего такая хрень вообще происходит
Передавайте векторы по ссылке, а не по значению. Ваш кэп smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 30.07.2025 21:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"