matlab — Создание полосовой матрицы в переполнении стека

Я пытаюсь преобразовать код Matlab, создав диагональную матрицу с полосами. Код Matlab, который я пытаюсь преобразовать:

N = 5;
e = ones(N-1, 1);
D = spdiags([-e 2*e -e], [-1 0 1], N-1, N-1);
D = full(D);

Выход вышеуказанного кода Matlab, D =

 2    -1     0     0
-1     2    -1     0
0    -1     2    -1
0     0    -1     2

Самая близкая попытка C ++, которую я получаю при преобразовании, заключается в следующем:

#include<iostream>
#include<vector>

using namespace std;
vector< vector<double> > bandedMat(vector<double> &e,int N);

int main()
{
int N = 5 ;
vector<double> e = {-1,2,-1};
vector< vector<double> > B = bandedMat(e,N);

return 0;
}
vector< vector<double> > bandedMat(vector<double> &e,int N)
{
vector< vector<double> > D(N-2, vector<double>(N,0.0));
double val = 0.0;

for(int i = 0; i < D.size(); i++)
{
for(int j = 0; j < e.size(); j++)
{
val = e[j];
D[i][i+j] = val; // Put along the diagonal of matrix D. Note the    index.
}
}

return D;
}

Вывод моего следующего кода на C ++ — D =

-1  2 -1  0  0
0  -1  2 -1  0
0  0  -1  2 -1

Как вы можете видеть, моя версия на C ++ отличается, она производит D как 3×5, в отличие от версии Matlab, которая производит D как 4 x 4. Кроме того, диагонали моей версии C ++ немного отличаются. Может кто-нибудь указать, как я могу получить точный D, как версия Matlab.

1

Решение

Хотя я думаю, что это не элегантно, по крайней мере, это решило мою проблему на данный момент. Вот:

vector< vector<double> > bandedMat(vector<double> &e,int N)
{
// Do some checking, Only tridiagonals are allowed.
if(e.size()>3)
{
cout << "Only tridiagonals are allowed. Input vector to function must be only 3 elements." << endl;
exit(EXIT_FAILURE);
}

vector< vector<double> > D(N-1, vector<double>(N-1,0.0));

for(size_t i = 0; i < D.size(); i++)
{
for(size_t j = 0; j < D.size(); j++)
{
if(i == j)
{
D[i][j] = e[1]; // put value of e[1] as the main diagonal of D
}
}
}

int j =0; // index
int k =0; // index

for(size_t i =0; i < D.size()-1;i++)
{
D[i][j+1] = e[0]; // put value e[0] as the upper diagonal
j = j+1;
}

for(size_t i =0; i < D.size()-1;i++)
{
D[i+1][k] = e[2]; // put value of e[2] as the lower diagonal
k = k+1;
}

return D;
}

Будет получена точная матрица, такая как версия Matlab. Если у кого-то есть идея получше или более элегантный способ сделать это, пожалуйста, поделитесь. Благодарю.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector