我需要制作一个n*n
矩阵m
,其元素遵循m(i,i+1)=sqrt(i)
,否则为0。例如,对于n=5
,我们应该
[0 a 0 0 0]
[0 0 b 0 0]
[0 0 0 c 0]
[0 0 0 0 d]
[0 0 0 0 0]
其中{a,b,c,d}=sqrt({1,2,3,4})
。 Here是一个常数三对角矩阵的解决方案,但我的情况比这复杂一点。我知道我可以用循环或列表理解来做到这一点,但还有其他方法吗? n
可能很大。
e.g。 (列表理解代码)
ele=lambda i,j:sqrt(i+1) if j-i==1 else 0
[[ele(i,j) for j in range(0,6)] for i in range(0,6)]
答案 0 :(得分:6)
一种方法是创建零数组,然后使用索引来选择并使用平方根值填充所需的索引。
例如:
>>> z = np.zeros((5,5))
>>> rng = np.arange(4)
>>> z[rng, rng+1] = np.sqrt(rng+1)
>>> z
array([[ 0. , 1. , 0. , 0. , 0. ],
[ 0. , 0. , 1.41421356, 0. , 0. ],
[ 0. , 0. , 0. , 1.73205081, 0. ],
[ 0. , 0. , 0. , 0. , 2. ],
[ 0. , 0. , 0. , 0. , 0. ]])
答案 1 :(得分:4)
您可以直接使用np.diag
:
>>> d = np.sqrt(1 + np.arange(4))
>>> np.diag(d, 1)
array([[ 0. , 1. , 0. , 0. , 0. ],
[ 0. , 0. , 1.41421356, 0. , 0. ],
[ 0. , 0. , 0. , 1.73205081, 0. ],
[ 0. , 0. , 0. , 0. , 2. ],
[ 0. , 0. , 0. , 0. , 0. ]])
np.diag
的第二个参数指定了有问题的对角线。
答案 2 :(得分:2)
显然有点晚了,但是我想在这个问题中引入numpy diagflat方法。可以通过以下方式完成:
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
typedef struct
{
char name[30];
float grade[3];
struct date birthdate;
}student;
int main()
{
student list[2];
int i,j;
for(i=0;i<2;i++)
{
printf("Enter student's name:\n");
gets(list[i].name);
printf("Enter student's birthday(y/m/d):\n");
scanf("%d%d%d",&list[i].birthdate.year,&list[i].birthdate.month,&list[i].birthdate.day);
for(j=0;j<3;j++)
{
printf("Enter student's grades:\n");
scanf("%f",&list[i].grade[j]);
}
}
return 0;
}