簡體   English   中英

使用Armadillo庫訪問矩陣列而不創建數據副本

[英]Access column of matrix without creating copy of data, using Armadillo library

我有一個(數據/存儲)類與成員arma::mat (一個矩陣),我想只訪問這個矩陣的一列( arma::colvec ),但我不想創建一個副本列中的數據。 有沒有辦法實現這個目標?

我的第一次嘗試是使用.col(i) ,但這會返回一個臨時的,所以引用它不起作用。

使用.colptr(i)不會創建副本,但它也返回一個double*而不是vec ,所以它讓我的生活變得有點困難。

struct Data
{
    mat A;

    /* constructors etc. */

    // reference to temporary (this is bad)
    const vec& getColumn(const uint i) { return A.col(i); }

    // doesn't create a copy, but doesn't return a vec either
    const double* getColumn2(const uint i) const { return A.colptr(i); }
}

想要這個的原因是類有向量和矩陣,我想制作統一的getter和setter方法,它們可以訪問其中一個向量,也可以訪問矩陣中的一列,具體取決於索引(用於迭代目的)。

一個例子:

struct Data
{
    mat A;
    vec b;

    // getter
    const vec& operator()(const uint i) const
    {
        if (i == 0)
        {
            return b;
        }
        else if (i == 1)
        {
            // return first column of A
        }
        // etc.
    }

    // setter
    vec& operator()(const uint i)
    {
        // similar to above
    }
}

根據zauguin回答,我找到了以下方法來實現所需的功能:

struct Data
{
    mat A;
    vec b;

    // getter
    subview_col<mat::elem_type> operator()(const uint i)
    {
        if (i == 0)
        {
            return b.col(0);
        }
        else if (i > 0 && i < (1 + A.n_cols()))
        {
            return A.col(i - 1);
        }
        else
        {
            // should probably do some error checking here
        }
    }

    // setter
    vec& operator()(const uint i)
    {
        // same as the above, but without consts in declaration
    }
}

這會返回subview_col<mat::elem_type>而不是vec ,但功能與我的目的相似/相同。 我不確定使用.col(0)vec的性能影響,但我並不擔心。

在arma中,A.col(i)不返回引用,而是臨時引用。 您可以返回此臨時值以獲取引用語義。 使用C ++ 14,只需編寫

    auto getColumn(const uint i) { return A.col(i); }

否則,您必須返回代理類型,它是

    subview_col<mat::elem_type> getColumn(const uint i) { return A.col(i); }

如果你必須返回vec而不是subview_col<...> ,你可以使用A.unsafe_col(i) ,但你必須確保,在A的生命周期結束后你不會嘗試使用它。 。 看這里

暫無
暫無

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

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