[英]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]));
}
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-v2
, v2-v3
, v3-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.