生成特定的对称矩阵

时间:2018-12-20 00:49:40

标签: matlab numpy matrix symmetric

我想要一种快速的方法(一行,在python numpy或matlab中),可以在知道其尺寸和参数a的情况下生成特定的对称矩阵。

此矩阵的对角线应为1-a,其他位置应为

1-a a a a ....... a a 1-a a ........... a a a 1-a a a a . . . . . . 1-a a a .......................... 1-a

4 个答案:

答案 0 :(得分:3)

在MATLAB中,您可以执行以下操作:

a*ones(n,n) + (1-2*a)*diag(ones(n,1))

其中n是矩阵的大小。

如果您可以住两行,也可以这样做:

A = a*ones(n,n);
A(1:n+1:end) = 1-a; %this sets the diagonal entries

我认为效率更高。

答案 1 :(得分:2)

@Savithru在Matlab中有两个很好的答案。在这里,我只是想做一个有趣的事情。...

编辑:令人惊讶的是,repmat后跟reshape实际上比加法要快。在下面的示例中,对不同的方法(包括Savithru方法)进行了计时和比较。

n = 1e4;
a = 2;
timeit(@() reshape([repmat([1-a, a*ones(1,n)], 1,n-1),1-a], n,n))
timeit(@() a*ones(n,n) + (1-2*a)*eye(n))
timeit(@() a*ones(n,n) + (1-2*a)*diag(ones(n,1)))
timeit(@() testf(a,n))

function y = testf(a,n)
A = a*ones(n,n);
A(1:n+1:end) = 1-a;
y = A;
end


ans =

    0.7034


ans =

    1.0010


ans =

    1.0091


ans =

    0.4209

答案 2 :(得分:1)

下面的方法可能不是1行,但是应该很快!

方法1:使用np.ones创建数组并填充fill_diagonal

通过numpy,您可以使用np.onesnp.fill_diagonal

a = 5
size = 5

arr = np.ones((size,size)) * a
np.fill_diagonal(arr, a-1)

>>> arr
array([[4., 5., 5., 5., 5.],
       [5., 4., 5., 5., 5.],
       [5., 5., 4., 5., 5.],
       [5., 5., 5., 4., 5.],
       [5., 5., 5., 5., 4.]])

方法2:改为用np.diag_indices填充对角线:

或者,使用np.diag_indices

arr = np.ones((size,size)) * a
di = np.diag_indices(size)
arr[di] = a-1

方法3:使用np.full创建数组

您还可以使用np.full代替np.ones创建原始数组:

arr = np.full((size,size), a)
np.fill_diagonal(arr, a-1)
# or:
# arr = np.full((size,size), a)
# np.fill_diagonal(arr, a-1)

答案 3 :(得分:1)

这里是一个麻木的班轮

a = 0.7
n = 4

np.where(np.eye(n), 1-a, a)
# array([[0.3, 0.7, 0.7, 0.7],
#        [0.7, 0.3, 0.7, 0.7],
#        [0.7, 0.7, 0.3, 0.7],
#        [0.7, 0.7, 0.7, 0.3]])

如果需要考虑速度,那么我建议

res = np.full((n, n), a)
np.einsum('ii->i', res)[:] = 1-a
res
# array([[0.3, 0.7, 0.7, 0.7],
#        [0.7, 0.3, 0.7, 0.7],
#        [0.7, 0.7, 0.3, 0.7],
#        [0.7, 0.7, 0.7, 0.3]])