5 Диагональная матрица и для петель - PullRequest
0 голосов
/ 19 марта 2019

Есть ли более простой способ построить 5-диагональную матрицу в Eigen? Я, вероятно, могу бегать по циклам и распределять диагонали и нули, но я сталкивался с диагональю <>, но не знал, как использовать ее для 5 диагоналей вместо одной. Есть идеи? РЕДАКТИРОВАТЬ: понял это! Для тех, кто интересуется; Вы можете использовать

matrix.diagonal(+n) = vector;
matrix.diagonal(-n) = vector;

для доступа к супер / суб диагоналям матрицы и записи поверх них с помощью векторов.

Общий вопрос: есть ли способ пропустить выделение при запуске цикла for в C ++? Например:

int n; //size of matrix
MatrixXd m(n,n); //nxn matrix

for(int i=0; i<n; i++)
{ 
   m(i,i) = 5; 
   m(i,i+1) = 6;
   m(i,i-1) = 4;
   m(i,i+2) = 7;
   m(i,i-2) = 3;
}


for (int i=0; i<n; i++)
{
    for(int j=0; j<n; j++)
    {
         if(m(i,j) = something) //I want the loop to skip m(i,j) where 
            break;              //i have already allocated values to m(i,j)
                                //How do I do that, in general, in C++?      
         else
       { m(i,j) = 0;}
    }
 }

Спасибо

1 Ответ

1 голос
/ 20 марта 2019

Звучит так, как будто вы хотите пропустить диагонали, потому что они уже инициализированы (выделенный здесь неверный термин).
Глядя на ваш цикл, в котором вы устанавливаете диагонали, вы можете видеть, что каждый (i, j), который вы устанавливаете, подчиняется abs(i-j) <= 2. Например, когда вы устанавливаете элемент (i, i+2) -> abs(i-(i+2)) -> abs(-2) -> 2, который меньше или равен 2.

Таким образом, условие во втором цикле должно быть:

if (abs(i-j) <= 2)
  continue;//break will exit the loop, continue will skip to the next iteration
...