Fortran Coder

标题: 请教关于矩阵增加及删除行、列的问题 [打印本页]

作者: goodlose    时间: 2015-1-17 21:01
标题: 请教关于矩阵增加及删除行、列的问题
本帖最后由 goodlose 于 2015-1-17 21:03 编辑

对于二维矩阵,如何有选择的删除其中的某一行及某一列,从而生成新的矩阵!算法如何实现?
万分感激!

作者: goodlose    时间: 2015-1-17 21:04
哪位大师帮忙解答哦
作者: fcode    时间: 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:

1.用两个数组。
Real :: a(3,4) , b(2,4)
b(1,:) = a(1,:)
b(2,:) = a(3,:)
这样b就相当于a删除了一列

2.用两个可分配数组。方法类同上面的。但可以实现缩减后还是 a

3.用一个可分配数组,一个指针:
[Fortran] 纯文本查看 复制代码
program www_fcode_cn
  Implicit None
  Integer , target :: a(3,4)
  Integer , pointer :: p(:,:)
  a(:,:) = reshape( (/1,2,3,4,5,6,7,8,9,10,11,12/) , (/3,4/) )
  p=>a
  write(*,99) p
  a(:,2:3) = a(:,3:4)
  p=>a(:,1:3)
  write(*,99) p
99 format(4(3i5,/))  
end program www_fcode_cn


4.用串表,类似于指针,但更复杂一些。
作者: goodlose    时间: 2015-1-19 13:18
fcode 发表于 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:

谢谢!作为初学者,我要好好消化下你的代码。
作者: goodlose    时间: 2015-1-19 23:24
fcode 发表于 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:

大师,请教一下:上面的代码中,你定义的a应该是3行4列吧,程序运行出来a是4行3列,这个是format控制的吗?format中的4指的是写4行然后空一行吗?另外一个问题 :对于5X5的数组A,我想扩展一列或一行,下面这种写法对吗?b=spread(a,1,1)
请大师赐教 !万分感激
作者: fcode    时间: 2015-1-20 09:02
1.数组没有行列之分,哪个维度是行,哪个维度是列,完全取决于你如何输出。
2.不对。spread用于数组的复制扩展,而非扩展一行或一列。比如:
  a = (/1,2,3,4/)
  b = spread( a , 1 , 2 )
  则 b = (/1,2,3,4/)
         (/1,2,3,4/)
  而 b = spread( a , 2 , 2 )
  则 b = (/1,1/)
         (/2,2/)
         (/3,3/)
         (/4,4/)
作者: goodlose    时间: 2015-1-20 10:48
fcode 发表于 2015-1-20 09:02
1.数组没有行列之分,哪个维度是行,哪个维度是列,完全取决于你如何输出。
2.不对。spread用于数组的复制 ...

恩  明白了!谢谢你的耐性回答。如果想在一个二维数组的最后增加一列、一行,就是把nXn的变为n+1Xn+1,应该怎么操作呢?
作者: pasuka    时间: 2015-1-20 14:28
goodlose 发表于 2015-1-20 10:48
恩  明白了!谢谢你的耐性回答。如果想在一个二维数组的最后增加一列、一行,就是把nXn的变为n+1Xn+1,应 ...

只有动态数组重新分配,譬如C里面的REALLOC
继续用指针会越界的
lz若要想接近Matlab那种体验,请彻底放弃Fortran转投C++和Eigen




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2