声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 994|回复: 8

[编程技巧] 新手问个问题,请大家帮忙谢谢

[复制链接]
发表于 2007-2-28 14:50 | 显示全部楼层 |阅读模式

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

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

x
请问这个错在哪里


x=[2003        8        6        0.4
2003        8        7        0.3
2003        8        11        -0.6
2003        8        16        -0.6
2003        8        17        0.6
2003        8        17        0.3
2003        8        17        0.2
2003        8        18        1.3
2003        8        18        0.7
2003        8        20        0.6
2003        8        21        0.6
2003        8        21        0.5
2003        8        21        4.6]

我想比较前3项如果相同的话就将最后一项相加并上移,如
2003        8        16        -0.6
2003        8        17        0.6
2003        8        17        0.3
2003        8        17        0.2
变为
2003        8        16        -0.6
2003        8        17        1.1

j=13;
for n =1:12
   for m =n+1:j  
       if((x(n,1)==x(m,1))&&(x(n,2)==x(m,2))&&(x(n,3)==x(m,3)))
           x(n,4)=abs(x(n,4))+abs(x(m,4));     
           j=j-1;
           x(m,:)=[];
       end
   end
end
请问错在哪里啊

[ 本帖最后由 eight 于 2007-2-28 15:45 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-2-28 15:56 | 显示全部楼层
x(m,:)=[];


这个语句执行后会导致矩阵x的维数发生变化(行数减少)
 楼主| 发表于 2007-2-28 16:10 | 显示全部楼层
我把它换成这种的
j=13;
for n =1:j-1
   for m =n+1:j  
       if((x(n,1)==x(m,1))&&(x(n,2)==x(m,2))&&(x(n,3)==x(m,3)))
           x(n,4)=abs(x(n,4))+abs(x(m,4));     
           j=j-1;
           x(m,:)=[];
       end
   end
end
可是还是有错
发表于 2007-2-28 17:25 | 显示全部楼层
原帖由 熊猫 于 2007-2-28 16:10 发表
我把它换成这种的
j=13;
for n =1:j-1
   for m =n+1:j  
       if((x(n,1)==x(m,1))&&(x(n,2)==x(m,2))&&(x(n,3)==x(m,3)))
           x(n,4)=abs(x(n,4))+abs(x(m,4));     
       ...



用以下代码吧,不知道有没有更简单的方法,欢迎指点

  1. [y, m, n] = unique(x(:,1:3), 'rows');
  2. y = [y, zeros(size(y,1),1)];
  3. for i = 1:max(n)
  4.     y(i, 4) = sum(x(i == n, 4));
  5. end
  6. y
复制代码

[ 本帖最后由 eight 于 2007-2-28 17:32 编辑 ]

评分

1

查看全部评分

发表于 2007-2-28 22:56 | 显示全部楼层
eight正解.若要好看一些,可稍作如下修改:
================================
[y,m,n] = unique(x(:,1:3),'rows');
k = max(n);  %%% 可统一用k标记元素不相同的行数.
y = [y,zeros(k,1)];
for i = 1:k
    y(i,4) = sum(x(i==n,4));
end
y
发表于 2007-2-28 23:12 | 显示全部楼层
原帖由 xjzuo 于 2007-2-28 22:56 发表
eight正解.若要好看一些,可稍作如下修改:
================================
= unique(x(:,1:3),'rows');
k = max(n);  %%% 可统一用k标记元素不相同的行数.
y = ;
for i = 1:k
    y(i,4) = sum(x ...


y=[y,zeros(k,1)] 有问题,y的第一维大小并非k

==================================
我算了一下, 好象并没有问题.
"y的第一维大小并非k"--------不知eight是否动手算了一下?
by xjzuo
==================================


==========eight=========================
不好意思,看错了,呵呵。你说得对,我当时没有动手算:lol ,
只粗略看了一下,不好意思:loveliness:
=======================================

[ 本帖最后由 eight 于 2007-3-1 10:44 编辑 ]
 楼主| 发表于 2007-3-1 09:49 | 显示全部楼层

回复 #4 eight 的帖子

请问y = [y, zeros(size(y,1),1)];是 什么 意思啊
 楼主| 发表于 2007-3-1 09:52 | 显示全部楼层

回复 #4 eight 的帖子

为什么如果我用b=[y, zeros(size(y,1),1)]得到的结果却是5列呢
 楼主| 发表于 2007-3-1 09:54 | 显示全部楼层

回复 #2 eight 的帖子

我知道了,谢谢了,我用了两次所以多了一列,
真的 很 谢谢
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-19 12:38 , Processed in 0.058721 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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