Board logo

标题: 彻底解决了,谢谢关注! [打印本页]

作者: hettyw    时间: 2009-10-7 15:07     标题: 彻底解决了,谢谢关注!

本帖最后由 hettyw 于 2009-10-8 13:34 编辑

现有组数据(t,x),t,x分别为同长度的向量,我想写一段程序,检查t的值是否有重复,然后把重复的后一个以及相对应的x值去掉,但是这样t长度就会减少,而写循环的时候定义的最大值就不对了。
请问如何能解决此问题,谢谢!

我自己写的如下,好像if用的也不对,反正总之就是运行不出来:
n=length(t);
for i=1:n-1
    for j=i+1:n
        if t(i)==t(j)
            t(j)=[];
            x(i)=(x(i)+x(j))/2;
            x(j)=[];
        end
    end
end
作者: Yesican    时间: 2009-10-7 15:08

只会用C语言的落伍人士飘过
作者: hettyw    时间: 2009-10-7 15:09


作者: hettyw    时间: 2009-10-7 15:19

写了老半天了,就剩这个问题解决不出来
作者: liujiayukob    时间: 2009-10-7 15:22

你可以先把这些重复的元素赋值为 0或者其它值,然后等你这段循环运行完之后,再写一段删除这些 0 的程序。比较笨的方法啊。。呵呵
作者: hettyw    时间: 2009-10-7 15:24

本帖最后由 hettyw 于 2009-10-7 15:33 编辑

5# liujiayukob


首先谢谢回复!
不过我也想过这样,但这些点怎么再找到呢?而且如果用for循环,还是有同样的问题。

作者: liujiayukob    时间: 2009-10-7 15:35

那你在x(j)=[]  ;
的后面再加一个n=length(t); 可以吗?
作者: hettyw    时间: 2009-10-7 15:41

7# liujiayukob


好像不行,因为已经在循环里面了。
错误反馈和之前一样,还是
Attempted to access t(108); index out of bounds because numel(t)=107.
Error in ==> temp at 6
        if t(i)==t(j)
作者: 一头牛    时间: 2009-10-7 16:34

楼主可以试一下下面的办法
[t_new , index] = unique(t,'first');
t_new = t(sort(index));
for i=1:length(t_new)
   x_new(i) = mean(x(t == t_new(i)));
end
作者: 6253387    时间: 2009-10-7 16:48

这个东西都忘记了。。飘过。。。我看看 或许想的起来
作者: joqoko    时间: 2009-10-7 17:20

现有组数据(t,x),t,x分别为同长度的向量,我想写一段程序,检查t的值是否有重复,然后把重复的后一个以及相对应的x值去掉,但是这样t长度就会减少,而写循环的时候定义的最大值就不对了。
请问如何能解决此问题,谢 ...
hettyw 发表于 2009-10-7 16:07


正好下班回来帮你看看

n=length(t);
k = 0;
for i=1:n-1
    for j=i+1:n
        if t(i)==t(j)
            t(j)=[];
            x(i)=(x(i)+x(j))/2;
            x(j)=[];
            k = k + 1;
        end
        if (n < k + j || n == k + j)
            break;
        end
    end
    if (i == n - k - 1 || i > n - k - 1)
        break;
    end

end

健壮性不知道,你查查有没有bug吧~急着出门不好意思啦,有问题晚上回来再说。
作者: joqoko    时间: 2009-10-7 17:22

那你在x(j)=[]  ;
的后面再加一个n=length(t); 可以吗?
liujiayukob 发表于 2009-10-7 16:35


循环变量不能这样改的~~还是会保持之前那个~
作者: sophieyen    时间: 2009-10-7 17:32

可不可以用WHILE呢?用循环的次数作为判断的变量,那这个变量是不是就可以在嵌套的程序中被修改了?不知道可以不可以。。
作者: hettyw    时间: 2009-10-7 17:33

正好下班回来帮你看看

n=length(t);
k = 0;
for i=1:n-1
    for j=i+1:n
        if t(i)==t(j)
            t(j)=[];
            x(i)=(x(i)+x(j))/2;
            x(j)=[];
            k = k +  ...
joqoko 发表于 2009-10-7 17:20

嗯,加一个变量一起循环,这主意不错。谢啦!
虽然其实我现在有别的方法了,根本不需要再调这个问题。
作者: hettyw    时间: 2009-10-7 17:34

楼主可以试一下下面的办法
[t_new , index] = unique(t,'first');
t_new = t(sort(index));
for i=1:length(t_new)
   x_new(i) = mean(x(t == t_new(i)));
end
一头牛 发表于 2009-10-7 16:34

好专业!
作者: hettyw    时间: 2009-10-7 17:36

谢谢大家!
作者: hettyw    时间: 2009-10-8 11:45

本帖最后由 hettyw 于 2009-10-8 12:11 编辑

现在改了这一段,本来没这一段整个程序运行的时候错误反馈有好几十行同样的Warning: Divide by zero.,加了这一段错误反馈明显减少,但是还有十几个,说明我还是没完全改对,有人知道我错在哪么?

n=length(t);
for i=1:n-1
    if i>numel(t)-1
        break;
    end
    for j=i+1:n
        if j>numel(t)
            break;
        end
        if t(i)==t(j)
            x(i)=(x(i)+x(j))/2;
            t(j)=[];
            x(j)=[];
            j=j-1;
        end
    end
end
作者: hettyw    时间: 2009-10-8 11:58

楼主可以试一下下面的办法
[t_new , index] = unique(t,'first');
t_new = t(sort(index));
for i=1:length(t_new)
   x_new(i) = mean(x(t == t_new(i)));
end
一头牛 发表于 2009-10-7 16:34

粘贴了这段,运行出来说
??? Error using ==> unique
Unknown flag.


作者: hettyw    时间: 2009-10-8 12:01

可不可以用WHILE呢?用循环的次数作为判断的变量,那这个变量是不是就可以在嵌套的程序中被修改了?不知道可以不可以。。
sophieyen 发表于 2009-10-7 17:32

how?





欢迎光临 人在德国 社区 (http://csuchen.de/bbs/) Powered by Discuz! 7.2