通过使用以下代码,我试图构建一个3 * 3矩阵,但无法这样做。任何帮助将不胜感激。
program array
implicit none
integer i, a(5), b(5), a1(5), a2(5), a3(5)
integer, dimension (5,5) :: mat1
a = [0,1,2,3,4]
b = [1,2,2,2,1]
i = 0
do i = 1,5
a1(i) = a(i)*a(i)
a2(i) = a(i)
a3(i) = 1
print*, a1(i), a2(i), a3(i)
end do
do i=1,5
mat1(i,:) = [a1(:,i),a2(:,i),a3(:,i)]
print*, mat1
end do
end program array
在我的输出中,我期望有一个5 * 3矩阵,其中[a1; a2; A3。但是,我收到以下错误。
$ gfortran -Wall -c "HW1.f95" #(in directory: Y:\Fortran & subroutines)
HW1.f95:28.20:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
1
Error: Syntax error in array constructor at (1)
HW1.f95:28.26:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
1
Error: Invalid character in name at (1)
HW1.f95:28.34:
mat1(:,i) = [a1(:,i);a2(:,i);a3(:,i)]
1
Error: Invalid character in name at (1)
Compilation failed.
答案 0 :(得分:0)
程序中编译失败有两个原因
你说你是
期望有一个5 * 3矩阵
为此,您需要在声明中声明mat1
为5 * 3矩阵,如
integer, dimension (5,3) :: mat1
或者稍后只写上前三个条目,比如
do i=1,5
mat1(i,1:3) = [a1(i),a2(i),a3(i)]
print*, mat1
end do
第二个opiton仍会留下一个5 * 5的矩阵,但它只会填入第一个树列。
您宣布a1
,a2
和a3
为一维。正如@francescalus在评论中已经指出的那样,你试图访问那些数组,就像它们有两个维度一样,但这些维度并不起作用。这是一种可能性
mat1(i,1:3) = [a1(i),a2(i),a3(i)]
答案 1 :(得分:0)
将三个长度为5的数组(a2,a2,a3)放入一个长度为15的数组中并使用RESHAPE:
program fill_mat1
integer, dimension(5,3) :: mat1
integer, dimension(5) :: a1,a2,a3
integer, dimension(15) :: a123
a1 = (/ 1, 2, 3, 4, 5 /)
a2 = (/ 6, 7, 8, 9,10 /)
a3 = (/ 11,12,13,14,15 /)
a123(1:5) = a1
a123(6:10) = a2
a123(11:15) = a3
mat1 = RESHAPE(a123,mat1)
end program
RESHAPE从a123获取值,并以Fortran标准顺序将它们填充为mat1的形状。当列表和形状之间的元素数量不一致时,还有用于排序值和填充的选项。这些都包含在RESHAPE内在文档中。