Elementele matricii

Ca si orice alta activitate, programarea depinde mult de factorul uman. Hai sa vedem ce ne face pe noi sa butonam.

Elementele matricii

Postby eric56 » 09 Jan 2012, 14:59

Cum pun elementele unei matrici patratice intr-un vector?????

ex:

3
1 0 1
4 5 4
2 6 4

IN 1 0 1 4 5 4 2 6 4 sau alta ordine, apoi le sortez si determin numere dar asta e alta treaba ...
m-am gandit timp de 1 sau 2 ore (nu mai tin minte cat) si nu-i dau rezolvare

Ma puteti ajuta ?
0,0p / 0 votes
Respecta si vei fi respectat
User avatar
eric56
Bit
 
Joined: 19 Dec 2011
Status: 0

Re: Elementele matricii

Postby eni4ever » 09 Jan 2012, 15:09

Hai să vedem : cum ai judeca tu problema ? Să vedem un start ...
Indiciu : Ia o matrice de 3x3 și numerotează indicii fiecărei celule. Apoi ia vectorul tău și pune indicii doriți din matrice în locația corespunzătoare din vector. Vezi dacă observi vreo relație. Dacă înțelegi asta, poți extinde ușor la matrici de orice dimensiune.
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Elementele matricii

Postby morpheus » 09 Jan 2012, 15:29

In C++ ?
  1.  
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <iterator>
  5.  
  6. int main()
  7. {
  8.     int mat[][3] = {{1,0,1}, {4,5,4}, {2,6,4}};
  9.     int vec[9];
  10.     std::copy(&mat[0][0], &mat[0][0] + 9, vec);
  11.     std::ostream_iterator<int> outIt (std::cout," ");
  12.     std::cout << "Inainte de sortare:\n";
  13.     std::copy(vec, vec + 9, outIt );
  14.     std::cout << "\nDupa sortare:\n";
  15.     std::sort(vec, vec + 9);
  16.     std::copy(vec, vec + 9, outIt );
  17.     return 0;
  18. }
  19.  
0,0p / 0 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84

Re: Elementele matricii

Postby Cosmin_NTG » 09 Jan 2012, 15:32

Am facut de multe ori chestia asta. Ideea e sa pui intr-un for imbricat un vector care sa acceseze toate elementele matricei (sau matricii, I think).
Anyway, sa trecem la cod.
  1. k=1;
  2. for(i=1; i<=n; i++)
  3. {   for(j=1; j<=n; j++)
  4.      {   vector[k]=matrice[i][j];
  5.          k++;
  6.      }
  7. }

K este o variabila contor care stocheaza lungimea vectorului. Stim de la inceput ca lungimea vectorului este n*n dar acea variabila are si un alt rol: acela de a accesa elementele vectorului astfel incat acesta sa poata stoca elementele matricei. Ai grija ca atunci cand lucrezi cu elementele vectorului sa mergi pana la k-1 pentru ca in ultima iteratie k-ul se incrementeaza in plus.
Codul complet:
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {    int i,j,v[100][100], n, vec[100], k=1;
  6.      cout<<"n=";
  7.      cin>>n;
  8.      for(i=1; i<=n; i++)
  9.      {  for(j=1; j<=n; j++)
  10.         {  cout<<"v["<<i<<"]["<<j<<"]=";
  11.            cin>>v[i][j];
  12.         }
  13.      }
  14.      for(i=1; i<=n; i++)
  15.      {  for(j=1; j<=n; j++)
  16.         {   vec[k]=v[i][j];
  17.             k++;
  18.         }
  19.      }
  20.      for(i=1; i<=k-1; i++)
  21.          cout<<vec[i]<<" ";
  22.      return (0);
  23. }
  24.  
Tocmai am instalat un nou IDE (Eclipse) - works parFum!
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Elementele matricii

Postby eric56 » 09 Jan 2012, 15:39

Da, in C++
Hei, eni!
Pentru exemplul urmator:

3
1 3 5
7 9 1
3 5 7
Am *descoperit* ca trebuie alocate n*n pozitii in vector si pot adopta urmatoarea ordine :

*PE pozitia 1 a vectorului : 1 (a[1][1])
*PE pozitia 2 a vectorului : 3 (a[1][2])
*PE pozitia 3 a vectorului : 5 (a[1][3])
*PE pozitia 4 a vectorului : 7 (a[2][1])
.
.
. etc.
*PE pozitia 9 a vectorului : 7 (a[3][3]) (numerele nu trebuie sa fie impare si nu au o regula, asa le-am pus eu).

Dar tot nu gasesc o rezolvare rezonabila + problema trebuie sa aiba timpul de executie 0.1s pe test

EDIT (acum am vazut comentariul lui COSMIN_NTG)
0,0p / 0 votes
Respecta si vei fi respectat
User avatar
eric56
Bit
 
Joined: 19 Dec 2011
Status: 0

Re: Elementele matricii

Postby eni4ever » 09 Jan 2012, 16:02

Deci, dacă considerăm matricea sursă mat[3][3] și vectorul destinație v[3*3] atunci vom vrea ca :
v[0] = mat[0][0];
v[1] = mat[0][1];
v[2] = mat[0][2];
v[3] = mat[1][0];
v[4] = mat[1][1];
v[5] = mat[1][2];
v[6] = mat[2][0];
v[7] = mat[2][1];
v[8] = mat[2][2];
(am început, după cum poți observa, de la bază 0 din motive cunoscute deja)

Din asta, putem observa că dacă v[i] = mat[y][x] atunci, pentru ceea ce vrem noi, i = y * dimensiune(mat) + x; Asta fiind valabil doar dacă matricea "mat" este pătratică. Dacă este așa atunci se poate face verificarea :
v[0 * 3 + 0 = 0] = mat[0][0];
v[0 * 3 + 1 = 1] = mat[0][1];
v[0 * 3 + 2 = 2] = mat[0][2];
v[1 * 3 + 0 = 3] = mat[1][0];
v[1 * 3 + 1 = 4] = mat[1][1];
v[1 * 3 + 2 = 5] = mat[1][2];
v[2 * 3 + 0 = 6] = mat[2][0];
v[2 * 3 + 1 = 7] = mat[2][1];
v[2 * 3 + 2 = 8] = mat[2][2];

ceea ce ne dă același rezultat.

O variantă mai intuitivă și mai ușor de urmărit ar fi cea propusă de Cosmin, deși ea necesită un consum mai mare de memorie prin prezența variabilei k. Am să te rog să parcurgi explicația mea, să te gândești la ea și, eventual, să scrii o bucățică de cod pentru a mai învăța câte ceva.

Spor
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Elementele matricii

Postby Cosmin_NTG » 09 Jan 2012, 16:10

@eni: Si eu m-am gandit la accesarea elementelor utilizand indicii dar nu am implementat-o pentru ca (eu unul am crezut) ca se pierde timp la efectuarea acelor operatii, de aceea am utilizat variabila k. Cu alte cuvinte, ce e mai important: memoria sau timpul de executie? De ce?

-- 09 Jan 2012, 15:10 --

@morpheus: Am citit undeva ca daca nu pun si pun inainte de fiecare flux cout si cin (si nu numai) std::, programul este mai rapid. Este adevarat acest lucru?
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Elementele matricii

Postby eni4ever » 09 Jan 2012, 16:15

^ O excelentă întrebare! Rămâi pe fir pentru o explicație mai en detail (aka. lucrez la un articol în acest sens :) )!

Răspuns rapid : În acest context, fiind vorba de cantități infime, ambele abordări sunt valide. Totuși, datorită faptului că eric e de 11 ani, mai bine îl pregătim pentru un mediu cu constrângeri echilibrate (memorie vs viteză), ca mai apoi să-și conștientizeze singur situația : embedd vs. PC.
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: Elementele matricii

Postby Cosmin_NTG » 09 Jan 2012, 16:52

Da, chiar ma gandeam la asta: daca acum la 11 ani el lucreaza cu matrici (cu care eu am lucrat la 15 ani), la 18 programeaza direct in binar (daca exista limbajul asta) :)).
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Elementele matricii

Postby morpheus » 09 Jan 2012, 17:49

Cosmin_NTG wrote:Am citit undeva ca daca nu pun si pun inainte de fiecare flux cout si cin (si nu numai) std::, programul este mai rapid. Este adevarat acest lucru?

Nu sunt diferente de viteza intre cele doua cazuri.
0,0p / 0 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84

Re: Elementele matricii

Postby Cosmin_NTG » 09 Jan 2012, 19:50

Am inteles. Dar exista diferente ce privesc functionalitatea memoriei respectiv a procesorului?
0,0p / 0 votes
Thinking about solutions is better than thinking about problems
User avatar
Cosmin_NTG
Byte
 
Joined: 11 Jan 2011
Location: 192.2L1.44G
Status: 10

Re: Elementele matricii

Postby eni4ever » 09 Jan 2012, 21:30

^ Următoarele surse s-au compilat cu :
g++ -Wall -o main main_cosmin.cpp

Avem 3 cazuri :

Concluzie: nu are impact asupra memoriei, deși este contraindicat să se folosească varianta cu using namespaces std; pentru că poluează mediul cu funcții din librăria standard. În felul acesta se pot isca conflicte în procesul de link-editare cu alte pachete ce conțin funcții cu același nume. Desigur, acest lucru este valabil în cadrul proiectelor mari cu multe clase și cod din multe terți.
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83


Return to Discutii despre programare

Who is online

Users browsing this forum: No registered users and 0 guests

cron