让您有一个包含std::vector< T >元素的T(其中n是指任何类或类型名称),并且您想填充一个矩阵状的对象,例如维行和boost::numeric::ublas::matrix< T >列,逐行或逐列地插入这些元素。首先,它必须是m1,否则我们试图用11个或更多元素填充10个插槽;则:如果m2(分别为n <= m1 * m2)没有问题,则循环就足够了。但是如果使用n <= m1(n <= m2),则必须拆分n > m1以避免出现坏索引问题,并根据您的选择填充矩阵。这是我的尝试:#include <algorithm>#include <boost/numeric/ublas/matrix.hpp>#include <vector>template < class T > inline void PopulateGrid(const std::vector< T >& tVector, boost::numeric::ublas::matrix< T >& tMatrix, char by = 'n'){ if (tVector.size() > tMatrix.size1() * tMatrix.size2()) throw("Matrix is too small to contain all the array elements!"); else { switch(by) { case 'r' : for (unsigned i = 0; i < tMatrix.size1(); i++) { for (unsigned j = 0; j < tVector.size(); j++) { if (j <= tMatrix.size2()) tMatrix(i, j) = tVector[j]; else tMatrix(i + 1, j - tMatrix.size2()) = tVector[j]; } } break; case 'c' : for (unsigned j = 0; j < tMatrix.size2(); j++) { for (unsigned i = 0; i < tVector.size(); i++) { if (i <= tMatrix.size1()) tMatrix(i, j) = tVector[i]; else tMatrix(i - tMatrix.size1(), j + 1) = tVector[j]; } } break; default: for (unsigned i = 0; i < tMatrix.size1(); i++) { for (unsigned j = 0; j < tVector.size(); j++) { if (j <= tMatrix.size2()) tMatrix(i, j) = tVector[j]; else tMatrix(i + 1, j - tMatrix.size2()) = tVector[j]; } } // Following is just to populate it randomly std::random_shuffle(tMatrix.begin1(), tMatrix.end1()); std::random_shuffle(tMatrix.begin2(), tMatrix.end2()); } }}一个快速的主要尝试:int main(){ std::vector< int > ciao; for (int i = 0; i < 12; i++) ciao.push_back(i); boost::numeric::ublas::matrix< int > peppa(10, 10); PopulateGrid< int >(ciao, peppa); // crashes! /* Check failed in file C:\DevTools\boost_1_54_0/boost/numeric/ublas/functional.hpp * at line 1371: * j < size_j * terminate called after throwing an instance of 'boost::numeric::ublas::bad_index' * what(): bad index */ return 0;}关键是:我缺少对索引的一些更简单的操作来获得相同的结果,并且搞砸了索引。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我将完全重写此答案,现在它更多是一个答案,而不再是一个建议。同样,您遇到的问题在这里:for (unsigned j = 0; j < tVector.size(); j++) { if (j <= tMatrix.size2()) tMatrix(i, j) = tVector[j]; else tMatrix(i + 1, j - tMatrix.size2()) = tVector[j];}这是您正在使用的嵌套for循环构造的内部循环。在这里,您将遍历整个向量。当j超过size2时,您不会退出循环,而是将(i + 1)作为tMatrix(i1,i2)的第一个索引。然后对于i2,您从j中减去size2。两个问题:一旦j超过size2,您将永远重写为值1的矩阵i1索引。然后,如果j变得大于2 * size2,您将尝试写出界外标记。例如,如果vecor包含20个元素,并且您有7 * 7矩阵,则当vectorIndex变为8时,您将立即写入vectorIndex-7。[请注意,您的越界。第二个问题是您的外部for循环仍将执行其迭代并为每个i值调用整个过程。最后,您将达到允许的最大i值,并且在您的内部循环中,您将尝试访问(i + 1)。这也会给您带来超出预期的期望。我建议像这样的解决方案:for ( std::vector<T>::iterator it = yourVector.begin(), int rowIndex = 0, colmIndex = 0; it != yourVector.end(); ++it, colmIndex++ ) { if ( colmIndex >= yourMatrix.size2() ) { rowIndex++; colmIndex = 0; yourMatrix (rowIndex, colmIndex ) = *it; } else { yourMatrix (rowIndex, colmIndex ) = *it; } }这未经测试,并按列填充向量。您应该能够自己弄清楚byRow的用途! (adsbygoogle = window.adsbygoogle || []).push({});
08-24 15:10