声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1891|回复: 10

[编程技巧] 请教如何使用 for 来提取矩阵的最小值

[复制链接]
发表于 2008-4-19 04:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
有三个矩阵x1,x2,x3,每个矩阵都是3*3,需要找出每个矩阵的最小值。请教如何使用'for'来提取矩阵?
比方说, for i=1:3
       这时我想对x1进行操作,该如何指定? 我直接使用 xi,提示错误。
谢谢。

[ 本帖最后由 ChaChing 于 2009-5-24 10:08 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-4-19 08:48 | 显示全部楼层
建议楼主找本基础的matlab书看看。
数组的下标应该用圆括号()。
发表于 2008-4-19 10:54 | 显示全部楼层
假设
x=[1 2 3; 23 0 23;1 21 85]
应用两次min()函数不知道能不能满足你的要求:
>> min(min(x))
ans =
     0
发表于 2008-4-19 11:11 | 显示全部楼层
自己先看看,应该是基础问题!!
发表于 2008-4-19 11:50 | 显示全部楼层
对于您的帖子,我想说三点:
1.如果您学过C语言,这个程序应该很容易可以实现,我觉得Matlab语言和C语言有些地方是相通的;
2.根据您的帖子内容,我编了一段代码,不知是不是您想要的:
A=[1,2,3;4,8,6;7,1,8];
[M,N]=size(A);%矩阵维数,M为矩阵行长度,N为矩阵列长度
t=inf;%t中间变量,赋值无穷大
for i=1:M, for j=1:N
     if A(i,j)<t   %if A(i,j)>t
         k=1; r=[]; c=[]; v=[];%行标数组, 列标数组, 最小值数组
         t=A(i,j); r(k)=i;c(k)=j;v(k)=t;
     elseif A(i,j)==t
         k=k+1; r(k)=i;c(k)=j; v(k)=t;
     end
end; end
r', c', v'  %转置
3.其实可以不用for循环来做,用min()、max()以及find()函数就可以实现,代码如下:
A=[1,2,3;4,9,6;7,1,8];
B=min(min(A));%B=max(max(A));
[r,c,v]=find(A==B)

以上代码有不妥的地方,还望高手指点!谢谢

[ 本帖最后由 ChaChing 于 2009-5-24 10:12 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-4-20 04:29 | 显示全部楼层
谢谢各位的帮忙。我想把问题澄清一下:如何对x1,x2,x3 进行同样的操作,这里x1,x2 x3 都是3*3的矩阵?

比方说,我想求x1,x2,x3这三个矩阵的最小值,可以使用三次: min(min(x1)), min(min(x2)),min(min(x3)).
那么,可不可以借助 for 命令,写一个循环语句,把三个矩阵的最小值都求出来:
for i=1:3
当i=1的时候,就对x1进行计算,,,,,
当i=2的时候, ,,,,,,,,x2,,,,,,,,,,,,,,,,
当i=3,,,,,,,,,,,,...........x3,,,,,,,,,,,,,,,
现在的问题是:如何指定这个矩阵x1, 当i=1的时候?
有没有一种办法,可以把x1中的1 与i=1 让matlab识别出来。


如果许多矩阵的时候,这样的循环语句会使编程简洁。我遇到的实际问题,有许多矩阵,而且 不同的矩阵有不同的维数。

[ 本帖最后由 xxdaishu 于 2008-4-19 20:13 编辑 ]
发表于 2008-4-20 07:53 | 显示全部楼层
原帖由 xxdaishu 于 2008-4-20 04:29 发表
谢谢各位的帮忙。我想把问题澄清一下:如何对x1,x2,x3 进行同样的操作,这里x1,x2 x3 都是3*3的矩阵?

比方说,我想求x1,x2,x3这三个矩阵的最小值,可以使用三次: min(min(x1)), min(min(x2)),min(min(x3)).
那么 ...


这样写,不知道您满意不?
X1=[1,2,3;4,8,6;7,1,8];
X2=[1,2,3;4,8,6;7,1,8];
X3=[1,2,3;4,8,6;7,1,8];
X={X1,X2,X3};
for i=1:3
    min(min(X{i}))
end
:@(

评分

2

查看全部评分

 楼主| 发表于 2008-4-20 09:15 | 显示全部楼层

回复 7楼 的帖子

谢谢了。
遇到的实际问题,有许多矩阵,而且 不同的矩阵有不同的维数。
发表于 2008-4-20 09:28 | 显示全部楼层

回复 8楼 的帖子

那你根据这个方法,自己再想办法解决吧

[ 本帖最后由 ch_j1985 于 2008-4-20 09:31 编辑 ]
发表于 2008-4-20 19:23 | 显示全部楼层
如果只是求最小值的话还是可以实现的,参看下面的程序。
  1. X1=[1,2,3,4,8,6,7,1,8];
  2. X2=[1,2,-3;4,8,6;7,1,8;7,1,8];
  3. X3(:,:,1)=[-1,2,3;4,8,6;7,1,8;4,8,6;7,1,8];
  4. X3(:,:,2)=[-1,2,3;4,8,6;7,1,8;4,8,6;7,1,8];
  5. X={X1,X2,X3};
  6. for i=1:3
  7.     a=X{i};
  8.     Xmin(i)=min(a(:));
  9. end
  10. Xmin
复制代码

评分

1

查看全部评分

发表于 2008-4-21 09:39 | 显示全部楼层
我晕倒,一个个都是偏离了楼主的意思,主要问题是Xi太多了要怎样批量处理吧.
以前用过类似的读取批量文件,不过还是查了半天终于找到eval这个函数来实现;
for k=1:3,
a=strcat('x',num2str(k));
b(k)=min(min(eval(a))) %每个矩阵取最小值存于b中
end

另外,我没料到就算那么多高手,都还是用i,j作为matlab的循环变量.个人觉得这点一定要跟C分开,因为这变量选择是C中最常见的.而在matlab中,i,j本身有虚数单位在里面.所以,程序中没有虚数处理自然没问题,如果涉及到了,出现问题,你就算把程序重新检查n遍都会觉得莫名其妙.我曾经深受其害,所以感触颇深.

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-11 15:02 , Processed in 0.122790 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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