haosmark
haosmark

Reputation: 1127

How do I dereference multidimensional vector pointer?

I'm stuck trying to get the value of what A[i][j] is pointing to. double a = A[i][j];. How do I correctly do it? Could someone please explain?

// g++ jacobi.cpp -O0 -o jacobi && ./jacobi
#include <iostream>
#include <iomanip>
#include <vector>
#include <climits>

using namespace std;

void print_matrix(vector<vector<double>>& m) {
  for (int i = 0; i < m.size(); i++) {
    for (int j = 0; j < m[0].size(); j++) {
      cout << setw(5) << fixed << setprecision(2) << m[i][j] << " ";
    }
    cout << endl;
  }
  cout << "==================================" << endl;
}

// calculate average temperature based on average of adjacent cells
double avg_temp_at(vector<vector<double>>& matrix, int i, int j) {
  return (
    matrix[i][j] +
    (j-1 >= 0 ? matrix[i][j-1] : 0) + 
    (i-1 >= 0 ? matrix[i-1][j] : 0) +
    (j+1 < matrix[0].size() ? matrix[i][j+1] : 0) +
    (i+1 < matrix.size() ? matrix[i+1][j] : 0)
  ) / 5;
}

// sequential Jacobi algorithm
vector<vector<double>> jacobi_relaxation(vector<vector<double>>& matrix, int& threshold) {
  vector<vector<double>> B (matrix.size(), vector<double>(matrix[0].size(), 0));
  vector<vector<double>>* A = &matrix;
  double max_delta = INT_MAX;

  while (max_delta > threshold) {
    max_delta = 0;

    for (int i = 0; i < matrix.size(); i++) {
      for (int j = 0; j < matrix[0].size(); j++) {
        B[i][j] = avg_temp_at(*A, i, j);

        double a = A[i][j];
        double delta = abs(B[i][j] - a);
        max_delta = max(max_delta, delta);
      }
    }
    print_matrix(B);
    A = &B;
  }

  return *A;
}

int main() {
  int threshold = 1;
  int n = 6;
  vector<vector<double>> matrix (n, vector<double>(n, 0));
  matrix[1][2] = 100;
  matrix[2][2] = 100;
  matrix[3][2] = 100;

  print_matrix(matrix);

  vector<vector<double>> x = jacobi_relaxation(matrix, threshold);
}

Upvotes: 0

Views: 143

Answers (1)

robbinc91
robbinc91

Reputation: 524

I tried your code and it gave me error on this line:

double a = A[i][j];

Change that line into this:

double a = (*A)[i][j];

and it will work.

Explanation: It's basically the same trick as in line B[i][j] = avg_temp_at(*A, i, j);. A is a pointer, which is pointing to a vector. To accessing to pointers "real data" you must use the *.

Here you can find more info about pointers.

Hope it helps.

Upvotes: 1

Related Questions