簡體   English   中英

在 C++ 中的行上壓縮的稀疏矩陣

[英]Sparse matrix compressed on rows in C++

我必須使用 3 個動態數組(索引從 0 開始)在 C++ 中實現 CSR 矩陣數據結構,但我被卡住了。 所以我必須實現2個功能:

1) modify(int i, int j, TElem e) - 將 (i,j) 的值修改為 e 或添加 if(如果不存在)或在 e 為空時刪除它。

2) element(int i, int j) const - 返回在 (i,j) 上找到的值

我想以下一種方式測試我的代碼:

矩陣 m(4,4); m.print(); 它會打印:

行:0 0 0 0 0

列:

價值觀:

(這很好)

現在如果我想修改: m.modify(1,1,5); //元素(1,1)將被設置為5

m.print() 的輸出; 將會:

行數:0 1 1 1 1

列:1

值:5(這也很好)

現在如果我想打印 m.element(1, 1) 它將返回 0 而 m.element(0, 1) 將返回 5。

這是我對 element(int i, int j) 的實現:

    int currCol;
    for (int pos = this->lines[i]; pos < this->lines[i+1]; pos++) {
        currCol = this->columns[pos];
        if (currCol == j)
            return this->values[pos];
        else if (currCol > j)
            break;
    }
    return NULL_TELEM;

構造函數如下所示:

Matrix::Matrix(int nrLines, int nrCols) {
    if (nrLines <= 0 || nrCols <= 0)
        throw exception();
    this->nr_lines = nrLines;
    this->nr_columns = nrCols;
    this->values = new TElem[100];
    this->values_capacity = 1;
    this->values_size = 0; 
    this->lines = new int[nrLines + 1];
    this->columns = new TElem[100];
    this->columns_capacity = 1;
    this->columns_size = 0; 
    for (int i = 0; i <= nrLines; i++)
        this->lines[i] = NULL_TELEM;
}

這是“修改”方法:

TElem Matrix::modify(int i, int j, TElem e) {
    if (i < 0 || j < 0 || i >= this->nr_lines || j >= nr_columns)
        throw exception();
    int pos = this->lines[i];
    int currCol = 0;
    for (; pos < this->lines[i + 1]; i++) {
        currCol = this->columns[pos];
        if (currCol >= j)
            break;
    }
    if (currCol != j) {
        if (!(e == 0)) 
            add(pos, i, j, e);
    }
    else if (e == 0)
        remove(pos, i);
    else
        this->values[pos] = e;
    return NULL_TELEM;
}

這是插入方法:

void Matrix::add(int index, int line, int column, TElem value)
{
    this->columns_size++;
    this->values_size++;
    for (int i = this->columns_size; i >= index + 1; i--) {
        this->columns[i] = this->columns[i - 1];
        this->values[i] = this->values[i - 1];
    }
    this->columns[index] = column;
    this->values[index] = value;
    for (int i = line; i <= this->nr_lines; i++) //changed to i = line + 1;
        this->lines[i]++;
}

有人可以幫我嗎? 我不知道為什么會發生這種情況,這些天我真的需要完成這個實現。

它只是無法通過下一個測試。 如果我想打印元素,我有 (4,0)=0 (4,1)=0 ... (4,8)=0 和 (4,9)=3。 現在這看起來很奇怪為什么會發生。

void testModify() {
    cout << "Test modify" << endl;
    Matrix m(10, 10);
    for (int j = 0; j < m.nrColumns(); j++)
        m.modify(4, j, 3);
    for (int i = 0; i < m.nrLines(); i++)
        for (int j = 0; j < m.nrColumns(); j++)
            if (i == 4)
                assert(m.element(i, j) == 3);
                //cout << i << " " << j << ":" << m.element(i, j)<<'\n';
            else
                assert(m.element(i, j) == NULL_TELEM);
}

當您使用空矩陣(全為零)調用modify(1, 1, 5)時,會導致調用add(0, 1, 1, 5) 這會增加columns_sizevalues_size (都為1 ),for 循環體將不會執行,您將columns[0]更新為1並將values[0]5 ,然后從元素lines[1]開始增加所有lines值,設置它們全部為 1( lines[0]仍將是0 )。 但是lines[1]應該表示我們剛剛添加的元素,所以它應該是0 ,因為該值是使用columns[0]

add末尾的 for 循環應該從元素line + 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM