Fortran Coder

查看: 7612|回复: 7

[线性代数] 请教关于矩阵增加及删除行、列的问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
24 点
发表于 2015-1-17 21:01:00 | 显示全部楼层 |阅读模式
本帖最后由 goodlose 于 2015-1-17 21:03 编辑

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

8

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
24 点
 楼主| 发表于 2015-1-17 21:04:33 | 显示全部楼层
哪位大师帮忙解答哦

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-1-17 21:36:34 | 显示全部楼层
数组是没有办法改变大小的。

间接的办法包括:

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.用串表,类似于指针,但更复杂一些。

8

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
24 点
 楼主| 发表于 2015-1-19 13:18:01 | 显示全部楼层
fcode 发表于 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:

谢谢!作为初学者,我要好好消化下你的代码。

8

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
24 点
 楼主| 发表于 2015-1-19 23:24:31 | 显示全部楼层
fcode 发表于 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:

大师,请教一下:上面的代码中,你定义的a应该是3行4列吧,程序运行出来a是4行3列,这个是format控制的吗?format中的4指的是写4行然后空一行吗?另外一个问题 :对于5X5的数组A,我想扩展一列或一行,下面这种写法对吗?b=spread(a,1,1)
请大师赐教 !万分感激

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-1-20 09:02:07 | 显示全部楼层
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/)

8

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
24 点
 楼主| 发表于 2015-1-20 10:48:39 | 显示全部楼层
fcode 发表于 2015-1-20 09:02
1.数组没有行列之分,哪个维度是行,哪个维度是列,完全取决于你如何输出。
2.不对。spread用于数组的复制 ...

恩  明白了!谢谢你的耐性回答。如果想在一个二维数组的最后增加一列、一行,就是把nXn的变为n+1Xn+1,应该怎么操作呢?

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

发表于 2015-1-20 14:28:39 | 显示全部楼层
goodlose 发表于 2015-1-20 10:48
恩  明白了!谢谢你的耐性回答。如果想在一个二维数组的最后增加一列、一行,就是把nXn的变为n+1Xn+1,应 ...

只有动态数组重新分配,譬如C里面的REALLOC
继续用指针会越界的
lz若要想接近Matlab那种体验,请彻底放弃Fortran转投C++和Eigen
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 10:39

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表