Установить единичную матрицу, используя вектор векторов C ++

0

Часть программы, которую я пишу, требует от меня создания вектора векторов, чтобы быть квадратной матрицей размеров 5. Кажется, нет вывода при попытке распечатать вектор, и я не знаю почему. Какие-нибудь советы?

#include<string>
#include<cstdlib>
#include<fstream>
#include<vector>
#include<iostream>
using namespace std;

int main(){
int rows=5;
vector< vector<double> > identity; // declare another vector of vectors, which         initially will be
// the identity matrix of the same dimensions as 'matrix'.

    for (int j=0; j<rows; j++) {//set up the identity matrix using the Kronecker Delta     relation. If row == col, then =1. Else =0.
        vector<double> temp2; // temporary vector to push onto identity
        identity.push_back(temp2);
        for (int k=0; k<rows; k++){
            if(j==k) {
            temp2.push_back(1);
            }
            else {
            temp2.push_back(0);
            }
        }
        identity.push_back(temp2);
    }
    // print out identity
    for (int j=0; j<identity.size(); j++) {
       for (int k=0; k<identity[0].size(); k++) {
           cout<<' '<<identity[j][k];
       }
       cout<<endl;
    }
}
  • 0
    Почему вы дважды выдвигаете temp2 на identity ?
  • 0
    Ой, я проверю это сейчас. РЕДАКТИРОВАТЬ: Это работает, я знал, что я был где-то глупо. Ура :)
Показать ещё 1 комментарий
Теги:
vector

1 ответ

1
Лучший ответ
    vector<double> temp2; // temporary vector to push onto identity
    identity.push_back(temp2);
    for (int k=0; k<rows; k++){
        if(j==k) {
        temp2.push_back(1);

Когда вы нажимаете temp2 на свой вектор верхнего уровня, он копируется. Изменение temp2 впоследствии не влияет на эту копию, которая принадлежит вектору идентификации.

Теперь вы снова нажимаете temp2 после его заполнения, но первый элемент в идентификаторе будет инициализированным по умолчанию вектором с нулевым размером. Структура, которую вы на самом деле заполняете, выглядит так:

 {{},
  {1, 0, 0, 0, 0},
  {},
  {0, 1, 0, 0, 0},
  {},
  {0, 0, 1, 0, 0},
  {},
  {0, 0, 0, 1, 0},
  {},
  {0, 0, 0, 0, 1}}

Итак, ваша петля

for (int j=0; j<identity.size(); j++) {
   for (int k=0; k<identity[0].size(); k++) {

никогда ничего не сделает, потому что identity[0].size() всегда равен нулю.


tl; dr: просто удалите первую identity.push_back(temp2).

  • 0
    Спасибо за ваш ответ, я понимаю, почему это не сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню