声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2026|回复: 10

[编程技巧] 实数复数混合数据排序问题

[复制链接]
发表于 2010-10-16 12:18 | 显示全部楼层 |阅读模式

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

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

x
我通过解方程,得到这样一个根矩阵
r
r =
  1.0e+004 *
  Columns 1 through 6
        0 + 0.0836i   0.0000 + 0.0907i   0.0000 + 0.1038i   0.0000 + 0.1170i   0.0000 + 0.1293i  -0.0000 + 0.1408i
        0 - 0.0836i   0.0000 - 0.0907i   0.0000 - 0.1038i   0.0000 - 0.1170i   0.0000 - 0.1293i  -0.0000 - 0.1408i
   0.0002             0.0353             0.0615             0.0819            -0.0987            -0.1133         
  -0.0002            -0.0353            -0.0615            -0.0819             0.0987             0.1133         
        0 + 0.0002i   0.0028             0.0069             0.0107             0.0144             0.0181         
        0 - 0.0002i  -0.0028            -0.0069            -0.0107            -0.0144            -0.0181         
  Columns 7 through 12
  -0.0000 + 0.1515i  -0.0000 + 0.1615i  -0.0000 + 0.1710i  -0.0000 + 0.1801i  -0.1692            -0.1783         
  -0.0000 - 0.1515i  -0.0000 - 0.1615i  -0.0000 - 0.1710i  -0.0000 - 0.1801i   0.0000 + 0.1886i  -0.0000 + 0.1969i
  -0.1264            -0.1383            -0.1493            -0.1595             0.0000 - 0.1886i  -0.0000 - 0.1969i
   0.1264             0.1383             0.1493             0.1595             0.1692             0.1783         
   0.0218             0.0255             0.0292             0.0328             0.0365             0.0401         
  -0.0218            -0.0255            -0.0292            -0.0328            -0.0365            -0.0401   

这是3对共轭根
我需要把大于0实根全部放在一行,小于0实根放在一行,对应大于0复根放一行,小于0复根放一行,请问可以如何实现。
我的算法
for num=1:6;
    for cnt=1:12
        tf(num,cnt)=isreal(r(num,cnt));
        if((tf(num,cnt) ==0) &&(real(r(num,cnt))>0));
          rs(1,cnt)  =r(num,cnt);
         elseif((tf(num,cnt) ==0) &&(real(r(num,cnt))<0));
          rs(2,cnt)  =r(num,cnt);
         elseif((tf(num,cnt)==1) &&(real(r(num,cnt))>0));
          rs(3,cnt)  =r(num,cnt);
         elseif(( tf(num,cnt)==1) &&(real(r(num,cnt))>0));
          rs(4,cnt)  =r(num,cnt);
        elseif(( tf(num,cnt)==1) &&(real(r(num,cnt))<0));
          rs(5,cnt)  =r(num,cnt);      
        else(( tf(num,cnt)==1) &&(real(r(num,cnt))<0));        
           rs(6,cnt)  =r(num,cnt);
   
        end
    end
end
这里面的问题,有两个实根,if没办法区分出怎么放,要怎么再判断一下,把较大的实根放一起?
回复
分享到:

使用道具 举报

 楼主| 发表于 2010-10-16 22:33 | 显示全部楼层
不知道哪位可以指点一下,盼

点评

反对: 2.0
反对: 2
  发表于 2010-10-18 08:44
发表于 2010-10-17 09:41 | 显示全部楼层
比如想要>0的实根:
ix=real(r)>0;
a=r(ix)
就是逻辑运算

评分

1

查看全部评分

发表于 2010-10-17 16:54 | 显示全部楼层
大于0实根:x(find(real(x)>0));
小于0实根:x(find(real(x)<0));
大于0虚根:x(find(imag(x)>0));
小于0虚根:x(find(imag(x)<0));

评分

1

查看全部评分

发表于 2010-10-17 18:11 | 显示全部楼层
回复 happy 的帖子

恩,是不是此处的
  1. find
复制代码
可以去掉呢?
发表于 2010-10-17 18:35 | 显示全部楼层
本帖最后由 happy 于 2010-10-17 18:42 编辑

效果是一样的,个人习惯问题

另外,如果没有记错的话,matlab版本比较老的话是要加这个find的。
老版本应该没有你说的这个功能
发表于 2010-10-17 20:02 | 显示全部楼层
回复 happy 的帖子

恩,是的,从效率的角度考虑,去掉是要快一些的
但是从直观的角度考虑,去掉不好理解,这是一对矛盾

评分

1

查看全部评分

发表于 2010-10-17 23:35 | 显示全部楼层
本帖最后由 ChaChing 于 2010-10-18 08:54 编辑

happy应该没我年长, 但的确是个人习惯问题, 因我也习惯如此用!:lol
但还是谢谢qibbxxt提醒:handshake

有时直观与效率两者间的选择, 的确是一门艺术!
 楼主| 发表于 2010-10-18 08:56 | 显示全部楼层
谢谢各位网友的提示,对于>0,和<0都好判断,关键〉0的有2个根,如何把较大的根放一起,把较小的实g根放一起
发表于 2010-10-18 09:00 | 显示全部楼层
回复 wusemm 的帖子

判断大小的话,可以用
  1. sort
复制代码
排序,也可用
  1. max,min
复制代码

评分

1

查看全部评分

发表于 2010-10-18 09:11 | 显示全部楼层
wusemm 发表于 2010-10-18 08:56
谢谢各位网友的提示,对于>0,和

不知道你所谓的大小评判标准是什么?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-21 19:05 , Processed in 0.058301 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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