goodlose 发表于 2015-1-17 21:01:00

请教关于矩阵增加及删除行、列的问题

本帖最后由 goodlose 于 2015-1-17 21:03 编辑

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

goodlose 发表于 2015-1-17 21:04:33

{:3_46:}哪位大师帮忙解答哦

fcode 发表于 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.用一个可分配数组,一个指针:
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:01

fcode 发表于 2015-1-17 21:36
数组是没有办法改变大小的。

间接的办法包括:


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

goodlose 发表于 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)
请大师赐教 !万分感激

fcode 发表于 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/)

goodlose 发表于 2015-1-20 10:48:39

fcode 发表于 2015-1-20 09:02
1.数组没有行列之分,哪个维度是行,哪个维度是列,完全取决于你如何输出。
2.不对。spread用于数组的复制 ...

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

pasuka 发表于 2015-1-20 14:28:39

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

只有动态数组重新分配,譬如C里面的REALLOC
继续用指针会越界的
lz若要想接近Matlab那种体验,请彻底放弃Fortran转投C++和Eigen
页: [1]
查看完整版本: 请教关于矩阵增加及删除行、列的问题