Re: двумерный массив с разным количеством элементов в строках С++

IceAge624

помогите создать.идея такова: строки массива содержат числа, полученные при прогонке одной и той же формулы, но с разным параметром и на разных интервалах. например: a*x+b. первая строка массива содержит числа, полученные при а=2 и х=[-10;10], вторая строка- а=3 x=[-12.5;12.5], третья-а=5 x=[-15;15] и т.д. может и не через массив, подскажите как плз. цель: создать набор числовых строк. элемент строки-результат прогонки формулы. ну, надеюсь, понятно

Anturag

Сделай как функцию.

Elina74

Ну, можно их в файл записать. Можно в текстовую строку.
Можно в хитрый массив:
float** a;
a = new float*[5];
a[0] = new float[2];
a[1] = new float[20];
a[2] = new float[1];
a[3] = new float[10];
a[4] = new float[3];
Так вроде должен получиться двумерный массив с разным числом столбцов в каждой строке.

IceAge624

спасибо. а если у меня этих строк - 100?или 1000?

Elina74

Думай сам. Почитай Страуструпа на досуге про оператор new.
Хинт: там еще нужен delete.

IceAge624

самА. ну все же 8 марта

rosali

vector<vector<double> > и всего-то. Ни delete тебе никаких других проблем.

MC_DOs

А в цикле new сделать?

lord2476

 
int f(int i)
{
return 5*i;
}

....
int n = 1000;
float **a;

a = (float **) malloc(n*sizeof(float*;
for (int i = 0; i < n; i++)
a[i] = (float*) malloc(f(i)*sizeof(float;

....

for (int i = 0; i < n; i++)
free(a[i]);

free(a);


вот только тебе придется создать массив из n элементов, где будут хранится кол-во элементов в каждой строке

lord2476

вектор всетаки не так уж и нужен.

nattana

это пример того, как не надо программировать на С++?

lord2476

тебе malloc не нравится?

nattana

:
vector<vector<double> > и всего-то. Ни delete тебе никаких других проблем.
так мне все же больше нравится.

nattana

писать быстрее и выглядит понятнее => будет меньше ошибок.
все-таки просили С++.
если захочется добавить функциональность, проблем будет явно меньше.

lord2476

я вектором пользуюсь когда действительно нужен.
т.е. когда действительно не ябу сколько элементов будет в массиве

lord2476

ага, но придется понять про push_back и pop_back

lord2476

и кстати скорость будет выше если не задействовать лишний раз C++
на чистом C будет работать быстрее.

lord2476

а что ты будешь делать с этим результатом?
если просто распечатаешь, то просто пиши сразу в файл по очереди )

IceAge624

ОЙ, ребята, ну и тираду вы тут раздули я уже сама подумала, как было рекомендовано ранее , и сделала через **.а с этим массивом у буду сигнал сворачивать, спектр считать, а данный массив будет служить базисом разложения по частотам. собственно я это уже сделала. всем спасибо за проявленный интерес

IceAge624

формула там не a*x+b, сами, наверное, понимаете. там вейвлет MHAT. просто не хотелось громоздкими формулами оперировать.стыжусь за незнание элементарного. еще раз спасибо за **

IceAge624


int i,j,k;
int len_mhat[]={23,24,26,28,31,34,39,44,51,61,76,101,151};
float **MHAT;
MHAT=new float*[13];
for(i=0;i<13;i++)
{
MHAT[i]=new float[len_mhat[i]];
const double sigma[]={0.06,0.085,0.115,0.145,0.17,0.2,0.23,0.26,0.28,0.31,0.33,0.36,0.39};
for (i=0;i<13;i++)
{
for(j=0;j<len_mhat[i];j++)
{
float t0=len_mhat[i]/2;
int dt=1;
float tj;
tj=t0+j*dt;
MHAT[i][j]=(1-tj*tj/2*pow(sigma[i],2*pow(2.71828,-(tj*tj/2*pow(sigm[i],2;
}

}
}
delete [] MHAT;
ну вот так я придумала. будьте снисходительны

Julie16

Перед delete []MHAT тебе сначала нужно в цикле удалить память каждого элемента. В общем для каждого new должен быть свой delete.

Julie16

И вообще это бред. Нужно MHAT[и] = new float...
MHAT[и][j]

Julie16

Вот я тупица У тебя наверное все как надо, просто [и] - скушалось форумским движкрм.

IceAge624

точно. у меня есть а как это оно скушалось?:)

IceAge624

и тут она сожралось! надо [и] писать что ли тута? куда i девается?

Julie16


[i][/i] делает написание в форуме наклонным.

IceAge624

понятно

lord2476

вообщем...
С 8 марта тебя
но женсой логики не понял

rosali

понять про push_back и pop_back
Здесь нужен только resize и operator[]
Вообще, если ты так волнуешься о производительности то надо ботать valarray, а не гнать тут про нереальную быстроту чистого Си.

rosali

куда i девается?
Надо программы в [ code ] [ /code ] обрамлять, тогда и отступы не потеряются и все остальное...

IceAge624

мдааа...спасибо

lord2476

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

rosali

Ну, я не имел ввиду ничего обидного, просто есть способы увеличить производительность намного лучшие, чем писать чего-то на чистом Си. Да и врядли тут вообще производительность можно за счет такой ерутда выиграть, свертки какие-то. Надо пойти на fftw.org и скачать эти свертки...
PS. я использую vector, чтобы память вовремя удалялась. Ты же вот например не пишешь
try{ ... } finally { delete ... }, значит при исключениях не удалится...

Julie16

Ну можно запихнуть указатель в стековую переменную(правда в auto_ptr нельзя) с автоудалением .
А еще маза посмотреть на ассемблерный код и время исполнения:

//qw.c - t = 410000
// -O3
#include <stdio.h>
#include <stdlib.h>

int main
{
int* mem = (int*)malloc(1000000*sizeof(int;
int i, j;
int sum = 0;
long long int t;

t = clock;
for ( j = 0; j < 100; j++ )
{
for ( i = 0; i < 1000000; i++ )
{
sum += mem[i];
}
}
t = clock - t;

free( mem );
printf( "%ld %d\n", t, sum );
}

//qw.cpp t = 610000
// -O3 -fno-exceptions
#include <stdio.h>
#include <stdlib.h>
#include <vector>

int main
{
std::vector< int > mem( 1000000 );
int i, j;
int sum = 0;
long long int t;

t = clock;
for ( j = 0; j < 100; j++ )
{
for ( i = 0; i < 1000000; i++ )
{
sum += mem[i];
}
}
t = clock - t;

printf( "%ld %d\n", t, sum );
}

Я кстати даже рассказывал об этом. gcc генерит отвратительный код для шаблонов.

rosali

правда в auto_ptr нельзя
Вот мне сдается, что класса auto_array не существует именно потому, что vector ничем не хуже. Просто ничем, resize не вызывай и будет тебе обычный Си-шный массив. Ну разве что еще длина отдельно будет храниться.

Julie16

Я уже объяснил почему хуже. И именно поэтому мне иногда приходится делать что-то типа:


auto_array_ptr< A > B_auto( new A[ n ] );
A* B = B_auto.get;
...bla_bla

return B_auto.release;

auto_array_ptr я написал сам. Странно что его нет в стандартной библиотеке.

bastii

Я уже объяснил почему хуже
Для туго соображающих, где ты об этом написал?

Julie16

Постом выше. gcc генерит отвратительный код для шаблонов. Если взять код без шаблонов и его шаблонизировать(больше ничего не меняя и потом сравнить скорости выполнения бесшаблонного кода и кода, сгенерированного из шаблона с тем же типом что и был, скорость может упасть раза в полтора.

bastii

Так у тебя тоже шаблоны.

Julie16

Да? Где? Посмотри еще раз. Подумай хорошенько.

bastii

А это что? auto_array_ptr< A >

Julie16

Тебе необходимо подумать на тему ГДЕ могут появляться замедления при работе с шаблонами и КАК. И тогда станет ясно ПОЧЕМУ в моем коде не будет замедлений.
Хинт: работать я буду с переменной B, а не B_auto.

bastii

Ну блин, так бы и сказал, что замедления происходят приработе с переменными, типы которых с шаблонами. Так?

bastii

А че так криво в gcc? Может какие настройки помогают? А что с VC++, не знаешь?

Julie16

Что с VC++ не знаю. Знаю что в intel c++ еще хуже. Разница по скорости - раза в 2.

bastii

Фига себе, это ж вся прелесть С++ пропадает.

Julie16

Почему?

bastii

Ну так обычно smart указатели юзают. Они же темплейтовые. Что-то типа CComQIPtr
Оставить комментарий
Имя или ник:
Комментарий: