Hirdetés

Új hozzászólás Aktív témák

  • HussarF

    addikt

    Sziasztok!

    Lenne egy kérdésem. Írtam egy rövid programot C++ -ban, amivel .txt-ből beolvasok egy ritka mátrixot (sparse matrix), majd Matrix Market formátumban kiíratom. A probléma, hogy az output formátumban már kerekített értékek vannak. Feltételezem azért, mert a float adattípusnak túl hosszúak a számok (bár sztem abban is el kéne férniük...). Ezért a MATRIX elnevezésű DIM*DIM méretű tömböt, amibe beolvasom a mátrixot, double típusúra vettem, ebben az esetben azonban, bár gond nélkül lefordul a forráskód, futtatásnál egyszerűen nem történik semmi. Hibaüzenet sincs. Próbáltam feltárni, hogy hol hasal el, de olyan, mint ha a main függvénybe sem lépne be. Fogalmam sincs, hogy mi a baj. A forráskód alább - ha itt a MATRIX[DIM*DIM] előtt a float-ot double-re cserélem, akkor történik az anomália. Van tipp, hogy mi a gond?

    #include <iostream>
    #include <fstream>
    #include <vector>

    using namespace std;

    const int DIM = 385;

    int main()
    {
    ifstream input("solveInput.txt");
    ofstream output("Input_MM_precise.mtx");
    float MATRIX[DIM*DIM];
    unsigned int nonzeros = 0;
    vector<int> nonzero_loc_row, nonzero_loc_col; //a nonzero element helye, sor és oszlop
    vector<float> nonzero_val; //a nonzero element értéke
    if (input.is_open())
    {
    for (int i = 0; i < DIM; i++)
    {
    for (int j = 0; j < DIM; j++)
    {
    input >> MATRIX[i*DIM + j];
    if (MATRIX[i*DIM + j] != 0)
    {
    nonzeros++;
    nonzero_loc_row.push_back(i);
    nonzero_loc_col.push_back(j);
    nonzero_val.push_back(MATRIX[i*DIM + j]);
    }
    }
    }
    }
    else cout << "Nem talalhato a fajl\n";

    output << DIM << " " << DIM << " " << nonzeros << endl;
    for (unsigned int i = 0; i < nonzeros; i++) output << nonzero_loc_row[i]+1 << " " << nonzero_loc_col[i]+1 << " " << nonzero_val[i] << endl; // +1 az 1-es alapú indexelés miatt

    output.close();

    cout << "\n" << "Vege" << endl;
    }

    Példa az input mátrixból - csak egy random kimásolás, hogy látszódjon pár szám:

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 2686.361 1943.819 119.4358 119.4358 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0.723588 2685.947 0 0 0 0 0 0 0 0 0 0 0 0 0 119.4358 119.4358 0
    0 0.04446005 0 1325.068 583.3548 119.4358 119.4358 0 0 0 0 0 0 0
    0 0.04446005 0 0.4402452 1679.329 0 0 0 0 0 0 0 0 0 0 0 0 0 172.5
    0 0 0 0.09013559 0 1324.239 583.3548 119.4358 119.4358 0 0 0 0 0
    0 0 0 0.09013559 0 0.4405208 1678.5 0 0 0 0 0 0 0 0 0 0 0 0 0 172
    0 0 0 0 0 0.09019202 0 1323.41 583.3548 119.4358 119.4358 0 0 0 0
    0 0 0 0 0 0.09019202 0 0.4407968 1677.672 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0.09024853 0 1322.581 583.3548 119.4358 119.4358 0
    0 0 0 0 0 0 0 0.09024853 0 0.4410731 1676.844 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0.0903051 0 1321.752 583.3548 119.4358 119.4358
    0 0 0 0 0 0 0 0 0 0.0903051 0 0.4413498 1676.016 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0.09036174 0 2681.386 583.3548 550.4225 0 0 stb.

    Végeredményben pedig ilyenek lesznek:
    2 2 2686.36
    2 3 1943.82
    2 4 119.436
    2 5 119.436
    3 2 0.723588
    3 3 2685.95
    3 17 119.436
    3 18 119.436
    4 2 0.0444601
    4 4 1325.07
    4 5 583.355
    4 6 119.436
    4 7 119.436
    5 2 0.0444601
    stb.

Új hozzászólás Aktív témák