Forum » Programiranje » [C++] velikost matrike
[C++] velikost matrike
rapvirus ::
Mogoče kdo ve kako veliko matriko je možno narediti s C++? Če napišem več kot M[100][100], mi javi segmentation fault??
- spremenilo: snow ()
CCfly ::
Matrika je lahko veliko, kolikor pomnilnika lahko za njo nakaže operacijski sistem. Seveda pa jo moraš narediti na kopici(heap) ne na skladu(stack).
"My goodness, we forgot generics!" -- Danny Kalev
OwcA ::
Lahko uporabiš kakšno podatkovno strukturo, ki sama skrbi za zaseganje pomnilnika, naprimer std::vector.
Otroška radovednost - gonilo napredka.
sid_dabster ::
Naredis vektor vektorjev cesarkoli.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)
Cofko Cof ::
@rapvirus Segmentation fault ti ponavad jav, če greš prek tabele, al pa če maš kj s pointerji narobe. Probej ugotovit u kateri vrstici je napaka, pa poglej, da nima tam kakšen counter preveliko vrednost al pa kj podobnga.
Dve dimenziji pa pretvorš u eno tkole: npr če hočeš dostopat do i-ega elementa j-ti vrstici, pri čemer ma vsaka vrstica n elementov, potem je indeks tega elementa (n*j)+i.
Dve dimenziji pa pretvorš u eno tkole: npr če hočeš dostopat do i-ega elementa j-ti vrstici, pri čemer ma vsaka vrstica n elementov, potem je indeks tega elementa (n*j)+i.
Ars longa,vita brevis.
sid_dabster ::
Bi, le se notranjemu vektorju moras dolociti tip elementa.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)
rapvirus ::
Ja sam kok pa pol dostopaš do elementov. A se da kok tok, da je podobno dvodimenzionalnemu polju? (A[1][4])
Cofko Cof ::
Jz sm še vedno prepričanja da matrika velikosti 100 x 100 ne bi smela bit noben problem in je verjetno nekje napaka v kodi (ker segmentation fault je dostopanje do pomnilnika, do katerega nimamo pravic,...) . Sam se uporabljal tudi precej večje matrike pa ni bilo problema.
Ars longa,vita brevis.
Zgodovina sprememb…
- spremenil: Cofko Cof ()
BigWhale ::
Ce imas veliko stevilo elementov potem se ti splaca uporabiti kaj drugega. Jaz bom spet navijal za Qt. ;)
qList<>, ki je sicer linearen ampak ce iz njega izpeljes en svoj razred, potem lahko do posameznih polj dostopas 'nelinearno'.
Jaz sem to ponucal za moje robotke in dela precej v redu. Cel array je pa 3D velikosti 100x100x100. Sem ga teral tudi do 1000x1000x1000, takrat je pa ze problem s spominom... ;)
qList<>, ki je sicer linearen ampak ce iz njega izpeljes en svoj razred, potem lahko do posameznih polj dostopas 'nelinearno'.
Jaz sem to ponucal za moje robotke in dela precej v redu. Cel array je pa 3D velikosti 100x100x100. Sem ga teral tudi do 1000x1000x1000, takrat je pa ze problem s spominom... ;)
rapvirus ::
Če nrdim vector< vector< int > > A; in pol hočm dostopat kot npr. A[0][0] mi javi segmentation fault
Cofko Cof ::
Tud 1024 x 1024 bi mogl delat(no odvisno od tega kaj so tvoji elementi v tabeli).
Evo kle maš naki za sprehod skoz tvojo matriko vektorjev, pišem iz glave tko, da nism 100% ziher:
for(int i=0;i < A.size(); i++)
{
std:: vector B = A.at(i);
for(int j=0;i < B.size(); j++)
{
std::string strd = B.at(j);
}
}
Lohk pa tud uprabš tist kar ti je BigWhale napisov, sj zgoraj sm ti pokazov kako dostopat do stvari, če maš linearno vse skupaj. Lahko si kr napišeš dve funkciji, za lažji dostop):
#DEFINE int dimension = 1024;
int AGet(int i, int j)
{
return A[dimesnion * j + i]
}
int ASet(i,j,value)
{
A[dimension * j + i] = value;
return 0;
}
In maš tkorekoč normalno tabelo, ko hočeš nastavit vrednost samo namesto A[1][1] = 5; narediš ASet(1,1,5), in namesto b = A[1][1]; imaš sedaj b = AGet(1,1).
Evo kle maš naki za sprehod skoz tvojo matriko vektorjev, pišem iz glave tko, da nism 100% ziher:
for(int i=0;i < A.size(); i++)
{
std:: vector B = A.at(i);
for(int j=0;i < B.size(); j++)
{
std::string strd = B.at(j);
}
}
Lohk pa tud uprabš tist kar ti je BigWhale napisov, sj zgoraj sm ti pokazov kako dostopat do stvari, če maš linearno vse skupaj. Lahko si kr napišeš dve funkciji, za lažji dostop):
#DEFINE int dimension = 1024;
int AGet(int i, int j)
{
return A[dimesnion * j + i]
}
int ASet(i,j,value)
{
A[dimension * j + i] = value;
return 0;
}
In maš tkorekoč normalno tabelo, ko hočeš nastavit vrednost samo namesto A[1][1] = 5; narediš ASet(1,1,5), in namesto b = A[1][1]; imaš sedaj b = AGet(1,1).
Ars longa,vita brevis.
Zgodovina sprememb…
- spremenil: Cofko Cof ()
rapvirus ::
Ok bom probala tko narest. Sej zdej ko gledam se mi zdi prou simpl vse. Hvala vsem za odgovore. LP
BigWhale ::
Ne kompliciraj si zivljenja z vector vector meckanjem. Vse skupaj lahko stlacis v en vector katerega stevilo elementov dolocis kar kot 1024x1024.
Do elementov pa potem dostopas precej podobno kot je Cof napisal.
Zavij si ta vektor v en razred in si napisi metode za branje in pisanje v 2D matriko pa je problem resen.
Do elementov pa potem dostopas precej podobno kot je Cof napisal.
Zavij si ta vektor v en razred in si napisi metode za branje in pisanje v 2D matriko pa je problem resen.
Jean-Paul ::
Nekateri smo pristaši takega načina dela z matrikami:
#include <iostream> class matrix { public: matrix::matrix(int nrows,int ncols) { a_=(double**)malloc(nrows*sizeof(double*)+nrows*ncols*sizeof(double)); a_[0]=(double*)(a_+nrows); for(int i=1;i<nrows;i++) a_[i]=a_[0]+i*ncols; } matrix::~matrix() { free(a_); } double*& operator[](int row) { return a_[row]; } private: double** a_; }; int main(void) { matrix A(1024,1024); for(int i=0;i<1024;i++) for(int j=0;j<1024;j++) A[i][j]=0.0; for(int i=0;i<1024;i++) for(int j=0;j<1024;j++) std::cout << A[i][j] << "\n"; return 0; }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Ali je mogoče?Oddelek: Programiranje | 1651 (1127) | Ciklamen |
» | programiranje v c++Oddelek: Programiranje | 1901 (1667) | Tutankhamun |
» | c++ in linux/windowsOddelek: Programiranje | 1733 (1609) | rapvirus |
» | std containers vs. own custom containersOddelek: Programiranje | 3812 (3633) | Mmm'Aah |
» | [c++] Pomoč pri izdelavi std::vector "wrapperja"Oddelek: Programiranje | 1587 (1488) | zhigatsey |