Re: двумерный массив с разным количеством элементов в строках С++
Сделай как функцию.
Можно в хитрый массив:
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];
Так вроде должен получиться двумерный массив с разным числом столбцов в каждой строке.
спасибо. а если у меня этих строк - 100?или 1000?
Хинт: там еще нужен delete.
самА. ну все же 8 марта
vector<vector<double> > и всего-то. Ни delete тебе никаких других проблем.
А в цикле new сделать?
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 элементов, где будут хранится кол-во элементов в каждой строке
вектор всетаки не так уж и нужен.
это пример того, как не надо программировать на С++?
тебе malloc не нравится?
:так мне все же больше нравится.
vector<vector<double> > и всего-то. Ни delete тебе никаких других проблем.
все-таки просили С++.
если захочется добавить функциональность, проблем будет явно меньше.
т.е. когда действительно не ябу сколько элементов будет в массиве
ага, но придется понять про push_back и pop_back
на чистом C будет работать быстрее.
если просто распечатаешь, то просто пиши сразу в файл по очереди )
ОЙ, ребята, ну и тираду вы тут раздули я уже сама подумала, как было рекомендовано ранее , и сделала через **.а с этим массивом у буду сигнал сворачивать, спектр считать, а данный массив будет служить базисом разложения по частотам. собственно я это уже сделала. всем спасибо за проявленный интерес
формула там не a*x+b, сами, наверное, понимаете. там вейвлет MHAT. просто не хотелось громоздкими формулами оперировать.стыжусь за незнание элементарного. еще раз спасибо за **
ну вот так я придумала. будьте снисходительны
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;
Перед delete []MHAT тебе сначала нужно в цикле удалить память каждого элемента. В общем для каждого new должен быть свой delete.
MHAT[и][j]
Вот я тупица У тебя наверное все как надо, просто [и] - скушалось форумским движкрм.
точно. у меня есть а как это оно скушалось?:)
и тут она сожралось! надо [и] писать что ли тута? куда i девается?
[i][/i] делает написание в форуме наклонным.
понятно
С 8 марта тебя
но женсой логики не понял
понять про push_back и pop_backЗдесь нужен только resize и operator[]
Вообще, если ты так волнуешься о производительности то надо ботать valarray, а не гнать тут про нереальную быстроту чистого Си.
куда i девается?Надо программы в [ code ] [ /code ] обрамлять, тогда и отступы не потеряются и все остальное...
мдааа...спасибо
а написал про пушбаки, т.к. когда пользуюсь вектором, то именно ради них.
PS. я использую vector, чтобы память вовремя удалялась. Ты же вот например не пишешь
try{ ... } finally { delete ... }, значит при исключениях не удалится...
А еще маза посмотреть на ассемблерный код и время исполнения:
//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 генерит отвратительный код для шаблонов.
правда в auto_ptr нельзяВот мне сдается, что класса auto_array не существует именно потому, что vector ничем не хуже. Просто ничем, resize не вызывай и будет тебе обычный Си-шный массив. Ну разве что еще длина отдельно будет храниться.
auto_array_ptr я написал сам. Странно что его нет в стандартной библиотеке.
auto_array_ptr< A > B_auto( new A[ n ] );
A* B = B_auto.get;
...bla_bla
return B_auto.release;
Я уже объяснил почему хужеДля туго соображающих, где ты об этом написал?
Постом выше. gcc генерит отвратительный код для шаблонов. Если взять код без шаблонов и его шаблонизировать(больше ничего не меняя и потом сравнить скорости выполнения бесшаблонного кода и кода, сгенерированного из шаблона с тем же типом что и был, скорость может упасть раза в полтора.
Так у тебя тоже шаблоны.
Да? Где? Посмотри еще раз. Подумай хорошенько.
А это что? auto_array_ptr< A >
Хинт: работать я буду с переменной B, а не B_auto.
Ну блин, так бы и сказал, что замедления происходят приработе с переменными, типы которых с шаблонами. Так?
А че так криво в gcc? Может какие настройки помогают? А что с VC++, не знаешь?
Что с VC++ не знаю. Знаю что в intel c++ еще хуже. Разница по скорости - раза в 2.
Фига себе, это ж вся прелесть С++ пропадает.
Почему?
Ну так обычно smart указатели юзают. Они же темплейтовые. Что-то типа CComQIPtr
Оставить комментарий
IceAge624
помогите создать.идея такова: строки массива содержат числа, полученные при прогонке одной и той же формулы, но с разным параметром и на разных интервалах. например: a*x+b. первая строка массива содержит числа, полученные при а=2 и х=[-10;10], вторая строка- а=3 x=[-12.5;12.5], третья-а=5 x=[-15;15] и т.д. может и не через массив, подскажите как плз. цель: создать набор числовых строк. элемент строки-результат прогонки формулы. ну, надеюсь, понятно