我正在尝试使用用户图上的二进制最小切割来检测社区。为此,我尝试使用本文所示的 Fiedler 方法的变体。这就是他们将其正式化的方式:
现在,我正在尝试使用 matlab 中的 CVX 包来执行此操作。这是我的代码:
tou = ((beta/ (e' * pi1 * e)) * tou1) + (((1 - beta) / (e' * pi2 * e)) * tou2);
n = 6;
cvx_begin
variable y(n)
minimize( y' * tou * y )
subject to
y' * pi1 * y == e' * pi1 * e
y' * pi2 * y == e' * pi2 * e
y' * pi1 * e == 0
y' * pi2 * e == 0
cvx_end
但它向我显示以下错误:
Disciplined convex programming error:
Invalid constraint: {convex} == {real constant}
Error in ==> cvx.eq at 12
b = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '==' );
Error in ==> fiedler at 16
y' * pi1 * y == e' * pi1 * e
这里 A1 是一个矩阵,定义如下:
A1 = [0 3 2 0 0 0; 3 0 3 1 0 0; 2 3 0 0 0 0; 0 1 0 0 4 2; 0 0 0 4 0 3; 0 0 0 2 3 0];
同样 A2 = A1。
并且 pi1 是一个矩阵,它是一个对角矩阵,其值等于该特定行中 A1 的所有值的总和。这样做我得到
pi1 = [5 0 0 0 0 0; 0 7 0 0 0 0; 0 0 5 0 0 0; 0 0 0 7 0 0; 0 0 0 0 7 0; 0 0 0 0 0 5];
类似地,pi1 = pi2。
并且 tou1 = pi1 - A1,并且 tou2 = pi2 - A2。
有人可以指出我到底做错了什么。这会有很大帮助。提前致谢 !