2015-03-10 2 views
1

Каким будет самый эффективный способ (например, балансовая память и скорость) для доступа к верхним или нижним треугольным элементам матрицы Armadillo? Я знаю, что могу предоставить вектор целых чисел для элементов, но по мере того, как матрицы становятся очень большими, я бы хотел избежать переноса другого большого вектора. Или существует эффективный способ быстрого создания нижних/верхних треугольных индексов?C++ Armadillo Access Треугольные матричные элементы

Например, матрица 5х5

// C++11 Initialization 
arma::mat B = { 1, 2, 3, 4, 5, 
       6, 7, 8, 9, 10, 
       11, 12, 13, 14, 15, 
       16, 17, 18, 19, 20, 
       21, 22, 23, 24, 25 }; 
B.reshape(5,5); 


// the matrix 
//1 6 11 16 21 
//2 7 12 17 22 
//3 8 13 18 23 
//4 9 14 19 24 
//5 10 15 20 25 

Я хотел бы вывести элементы в нижнем треугольнике, где в результате вектор будет:

2 3 4 5 8 9 10 14 15 20 

Единственное решение, которое я могу думать о праве теперь используется объект uvec. Например:

arma::uvec idx {1,2,3,4,7,8,9,13,14,19); 
arma::vec lower_elems = B.elem(idx); 

Конечный объект не обязательно должен быть вектором. Мне просто нужно иметь доступ к элементам для различных сравнений. В качестве простого примера предположим, что я хотел бы проверить, если все они равны 0.

ответ

2

Чтобы проверить, если все элементы в нижнем треугольнике равны нулю:

bool all_zero = all(X.elem(find(trimatl(X))) == 0); 
+0

Это близко, но он также включает в себя диагональ. Есть ли способ смотреть только на треугольные элементы? Например, диагональная матрица 3x3 появляется как ложная, когда она должна быть верной для верхнего или нижнего треугольника, если любой из диагональных элементов не равен нулю. – cdeterman

+0

Насколько я знаю, определение треугольных матриц всегда включает диагональ. См. Например, определения в [MathWorld] (http://mathworld.wolfram.com/TriangularMatrix.html) и [Википедия] (http://en.wikipedia.org/wiki/Triangular_matrix) – mtall

+0

wiki относится к верхней и нижней треугольные матрицы, как все элементы ** ниже ** и ** выше **, основная диагональ равна нулю. Мне не кажется, что они должны включать диагональ. – cdeterman

Смежные вопросы