簡體   English   中英

C ++-矩陣減法

[英]C++ - Matrix subtraction

我正在做一些非常基本的線性代數,而我可能在這里完全沒了重點。

假設我有以下矩陣:

v1 = [5, 8]
v2 = [3, 4]
v3 = [4, 4]
v4 = [2, 1]

預期產量:

M1 = [5 - 3, 8 - 4] = [2, 4] 
M2 = [4 - 2, 4 - 1] = [2, 3]

實際輸出:

0 0 
0 0 
2 4 
-1 0 
2 3 

這是代碼:

std::vector<double> calculate(std::vector<double> values, std::vector<double> values2)
{
    std::vector<double> vel(2, 0);

    for(unsigned i=0; (i < values.size()); i++)
    {
        vel[i] = values[i] - values2[i];
    }

    return vel;
}



  std::vector<std::vector<double> > values = { {5,8}, {3, 4}, {4, 4}, {2, 1}};

    std::vector<std::vector<double> > v;

    v.resize(2);

    for(unsigned i=0; (i < values.size()-1); i++)
    {   
        v[i].resize(2);
        v.push_back(calculate(values[i], values[i + 1]));
        //v[i] = calculate(values[i], values[i + 1]);
    }

    for(unsigned i=0; (i < v.size()); i++)
    {
        for(unsigned j=0; (j < v[i].size()); j++)
        {
            std::cout << v[i][j] << " ";
        }
        std::cout << std::endl;
    }

問題是,以下代碼應迭代4次,計算4個矩陣,最終的2D向量應僅包含2個值。

我可能想念一些愚蠢的東西。

v.resize(2); // now it contains `{{} {}}`.
for(unsigned i=0; (i < values.size()-1); i++) //for each input except the last (3 iterations)
                    //starting with {5,8} and {3,4}
    v[i].resize(2); //resize one of the vectors already in v to 2 
                    //now v contains {{0,0}, {}
    v.push_back(calculate(values[i], values[i + 1])); //push back the calculations
                    //now v contains {{0,0}, {}, {2,4}}
for(............. (i < values.size()-1); i++)
                    //next the middle pair of inputs  {3,4} and {4,4}
    v[i].resize(2); //resize one of the vectors already in v to 2 
                    //now v contains {{0,0}, {0,0}, {2,4}}
    v.push_back(calculate(values[i], values[i + 1])); //push back the calculations
                    //now v contains {{0,0}, {0,0}, {2,4}, {-1,0}}
for(............. (i < values.size()-1); i++)
                    //finally the last pair of inputs  {4,4} and {2,1}
    v[i].resize(2); //resize the {2,4} to 2, but it was already two
                    //now v contains {{0,0}, {0,0}, {2,4}, {-1,0}}
    v.push_back(calculate(values[i], values[i + 1])); //push back the calculations
                    //now v contains {{0,0}, {0,0}, {2,4}, {-1,0}, {2,3}}
for(............. (i < values.size()-1); ....) //done iterating

你有調試器嗎? 學習如何逐步執行此類代碼,請他人演示或查找教程非常重要。 在調試器中單步執行此代碼將使您顯而易見。

幸運的是,該代碼非常易於修復:

std::vector<std::vector<double> > v;

for(unsigned i=0; i<values.size()-1; i+=2) //NOTE: i+=2!!!
{   
    v.push_back(calculate(values[i], values[i + 1]));
}

證明: http : //coliru.stacked-crooked.com/a/827a0183f1e7c582

for(unsigned i=0; (i < values.size()-1); i++)
{   
    v[i].resize(2);
    v.push_back(calculate(values[i], values[i + 1]));
    //v[i] = calculate(values[i], values[i + 1]);
}

此循環對values兩個元素進行操作,因此每次迭代計數器需要增加2。 否則,您將減去v1-v2v2-v3v3-v4等。 同樣,也無需在push_back之前確定向量的大小(這實際上很危險,因為在元素被推回之前,索引可能超出范圍)。

for(unsigned i=0; (i < values.size()-1); i+=2)
{   
    //v[i].resize(2);
    v.push_back(calculate(values[i], values[i + 1]));
    //v[i] = calculate(values[i], values[i + 1]);
}

正如其他人所指出的v.resize(2); 也不應該在那里,因為它最初只是添加了兩個不需要的空元素。

v.resize(2);

我不知道您期望上述操作是什么,但這(與下面的代碼一起)是負責輸出的前兩行的原因。

for(unsigned i=0; (i < values.size()-1); i++)
{   
    v[i].resize(2);

我不知道您期望上述操作是什么,但這(與上面的代碼一起)是負責輸出的前兩行的原因。

這是發生了什么:您的第一個調整大小(循環外部的調整大小)用兩個空向量填充v 前兩個通過循環,將v[0]v[1]填充為具有兩個均為零的元素的double的向量。

    v.push_back(calculate(values[i], values[i + 1]));

最終,這將為v添加另外三個元素,一個元素為{5,8}-{3,4} = {2,4},另一個元素為{3,4}-{4,4} = {-1,0 },最后一個是{4,4}-{2,1} = {2,3}。 所以你的輸出應該是

0 0
0 0
2 4
-1 0
2 3

要擺脫前兩行,只需刪除兩個調用resize 要擺脫倒數第二行( -1 0在兩條期望的輸出行之間),請將循環增量從一( i++ )更改為兩( i += 2 )。

此輸出

    0 0 
    0 0 
    2 4 
   -1 0 
    2 3 

可以很簡單地解釋

首先使用方法調整大小

v.resize(2);

您在向量v中添加了兩個空的std :: vector。

然后循環

for(unsigned i=0; (i < values.size()-1); i++)
{   
    v[i].resize(2);
    v.push_back(calculate(values[i], values[i + 1]));
    //v[i] = calculate(values[i], values[i + 1]);
}

您調整了每一個的大小。 所以現在v [0]和v [1]是

0 0 
0 0 

然后你減去

values[0] - values[1]
values[1] - values[2]
values[2] - values[3]

在向量v之后附加

    2 4 
   -1 0 
    2 3 

暫無
暫無

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

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