我正在使用Armadillo库手动移植一段Matlab代码。 matlab代码使用eigs()函数来查找相对较大(200x200)协方差矩阵R的少量(~3)个特征向量。代码如下所示:
[E,D] = eigs(R,3,"lm");
在Armadillo中有两个函数eigs_sym()和eigs_gen(),但前者只支持真正的对称矩阵,而后者需要ARPACK(我正在为Android构建代码)。有没有理由eigs_sym不支持复杂矩阵?有没有其他方法可以找到复对称矩阵的特征向量?
答案 0 :(得分:2)
Armadillo中的eigs_sym()和eigs_gen()函数(其中 s 在eig s 中代表稀疏)适用于大sparse 矩阵。 A"大"在这种情况下,大小约为5000x5000或更大。
你的R矩阵的大小为200x200。根据现行标准,这是非常小的。简单地使用密集的特征分解eig_sym()或eig_gen()函数来获取所有特征值/特征向量,然后使用.tail_cols()
操作(如ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null null null);
if (c != null)
if (c.moveToFirst()) {
do {
...
if (enoughRead)
break;
} while (c.moveToNext());
提取它们的子集会快得多}
答案 1 :(得分:0)
您是否通过将每个复数值a + bi替换为2x2矩阵[a,b; -b,a](或者使用此块的变体)来测试构建400x400实对称矩阵?
这应该构造一个真实的对称矩阵,它在某种程度上对应于复杂的矩阵。 由于尺寸较大,将会减速,并且所有特征值都将被复制(这可能会减慢算法速度),但测试似乎很简单。