我正在尝试编写一个函数来从给定矩阵中提取切片,其中输入为1D且切片可以是1D或2D。
我正在尝试将push_back
函数用于此目的,但由于某些原因,push_back
不起作用。
我在第OutPut.push_back(DumyValue);
行
任何人都可以帮助我,为什么我收到此错误? 此外,如果您能告诉我如何解决此问题,将不胜感激。 此外,如果第一部分变得清晰,有人可以告诉我如何使用push_back在特定位置插入一个整数,以便我可以用它来提取2D切片吗?
如果删除行OutPut.push_back(DumyValue);
,则代码应该有效。
#include<iostream>
#include<vector>
using namespace std;
int MatrixSlice(vector<vector<int>> Input, int Row1, int Row2, int Col1, int Col2) {
//define the slice size, if it is iD or 2D
if (abs(Row1-Row2)>1 && abs(Col1-Col2)>1){
vector<vector<int>> OutPut;
}else{
vector<int> OutPut;
}
int i2;
int j2;
for (int i = Row1; i <= Row2; i++) {
i2=0;
for (int j = Col1; j <= Col2; j++) {
int DumyValue=Input[i][j];
OutPut.push_back(DumyValue);
i2++;
//cout << Input[i][j] << endl;
}
j2++;
}
return 0;
}
int main() {
//Define a matrix for test:
vector<vector<int>> Matrix2(4, vector<int>(5, 1));
int R = 4;
int C = 4;
vector<vector<int>> MatrixInput(R, vector<int>(C, 1));;
for (int i = 0; i < MatrixInput.size(); i++) {
for (int j = 0; j < MatrixInput[0].size(); j++) {
int temp;
temp = i^2+j^2;
MatrixInput[i][j] = temp;
}
}
MatrixSlice(MatrixInput, 0, 3, 1, 1);
printf("\n");
return 0;
}
答案 0 :(得分:1)
Matrix slice有几个问题:
int
的返回类型毫无意义。矩阵被切成碎片,但接着是什么?它无法通过它回复给调用者。这可以通过union
修复,但是可以!对此的记账将是一场蓝精灵的噩梦。不要这样做!
接下来要始终使用vector
vector
,但我不喜欢这个想法有几个原因,我将在下面介绍。
相反,我在一个vector
周围放置一个简单的包装器对象。这样做有两个原因:
vector
的数据在内存中是连续的,并且获得了缓存友好性的回报。 vector
vector
基本上是指向数据数组的指针列表,通过内存中的指针追逐的odyssey发送可怜的CPU来查找列。如果列很短,这确实会对性能产生影响。我们走了:
template<class TYPE>
class Matrix
{
private:
size_t mNrRows; // note size_t. This is unsigned because there is no reason
// for a matrix with a negative size. size_t is also guaranteed
// to fit anything you can throw at it.
size_t mNrColumns;
std::vector<TYPE> mVec;
public:
// make a default-initialized matrix
Matrix(size_t nrRows, size_t nrColumns) :
mNrRows(nrRows), mNrColumns(nrColumns), mVec(mNrRows * mNrColumns)
{
}
// make a def-initialized matrix
Matrix(size_t nrRows, size_t nrColumns, TYPE def) :
mNrRows(nrRows), mNrColumns(nrColumns), mVec(mNrRows * mNrColumns,
def)
{
}
// gimme a value and allow it to be changed
TYPE & operator()(size_t row, size_t column)
{
// could check for out of bounds and throw an exception here
return mVec[row * mNrColumns + column];
}
//gimme a value and do not allow it to be changed
TYPE operator()(size_t row, size_t column) const
{
return mVec[row * mNrColumns + column];
}
// gimme the number of rows
size_t getRows() const
{
return mNrRows;
}
// gimmie the number of columns.
size_t getColumns() const
{
return mNrColumns;
}
// printing convenience
friend std::ostream & operator<<(std::ostream & out, const Matrix & mat)
{
int count = 0;
for (TYPE val: mat.mVec)
{
out << val;
if (++count == mat.mNrColumns)
{
out << '\n';
count = 0;
}
else
{
out << ' ';
}
}
return out;
}
};
vector
成员处理所有繁重的工作,因此the Rule of Zero建议保留副本并将构造函数,赋值运算符和析构函数移动到编译器。
这对MatrixSlice
有什么作用?好吧,首先它现在收到并返回Matrix
而不是vector<vector>
和int
。内部使用Matrix
并且关于1D或2D的混淆明显消失,导致功能更简单。
Matrix<int> MatrixSlice(const Matrix<int> & Input,
int Row1,
int Row2,
int Col1,
int Col2)
{
Matrix<int> OutPut(Row2-Row1 + 1,
Col2-Col1 + 1); // but what if Row1 > Row2?
int i2;
int j2= 0; // definitely need to initialize this sucker.
for (int i = Row1; i <= Row2; i++) // logical problem here: What if Row2 >= input.getRows()?
{
i2 = 0;
for (int j = Col1; j <= Col2; j++) // similar problem here
{
int DumyValue = Input(i, j);
OutPut(j2, i2) = DumyValue;
i2++;
}
j2++;
}
return OutPut;
}
并不是说这完全忽略了使切片成为Matrix
方法的非常合理的选择。虽然它有意义,但它不需要是一种方法,股票推荐是喜欢自由功能。一个很好的改进是使该函数成为一个模板,以便除了Matrix
之外它还可以处理各种Matrix<int>
。
最后,main
会发生什么?
int main()
{
//Define a matrix for test:
Matrix<int> Matrix2(4, 5, 1); // initialize matrix to all 1s
int R = 4;
int C = 4;
Matrix<int> MatrixInput(R, C); // default initialize the matrix
for (int i = 0; i < MatrixInput.getRows(); i++)
{
for (int j = 0; j < MatrixInput.getColumns(); j++)
{
int temp;
temp = i ^ 2 + j ^ 2;
// WARNING: ^ is XOR, not exponent. Maybe OP wants i XOR 2, but not
// likely. But if XOR is the desired operation, there is a lurking
// order of operation bug that needs to be addressed
MatrixInput(i, j) = temp;
}
}
std::cout << MatrixInput << '\n';
std::cout << MatrixSlice(MatrixInput, 0, 3, 1, 1);
return 0;
}
答案 1 :(得分:0)
在您的代码中
Dim a_b_c_d As String, abcd As String
OutPut仅存在于IF语句的末尾。
您可以在没有if语句的情况下使用它,也可以将使用它的所有代码添加到if语句中。