彻底解决了,谢谢关注!

本帖最后由 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
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……
Share |
Share

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

how?
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

楼主可以试一下下面的办法
[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.

Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

本帖最后由 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
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

谢谢大家!
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

楼主可以试一下下面的办法
[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

好专业!
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

正好下班回来帮你看看

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

嗯,加一个变量一起循环,这主意不错。谢啦!
虽然其实我现在有别的方法了,根本不需要再调这个问题。
Wrong cannot afford defeat but Right can.
别跟我学。姐是个传说,姐用自己的行动写着自己的传说……

TOP

可不可以用WHILE呢?用循环的次数作为判断的变量,那这个变量是不是就可以在嵌套的程序中被修改了?不知道可以不可以。。

TOP

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


循环变量不能这样改的~~还是会保持之前那个~
CSUCHEN--追逐你的梦想

猪qoko如是说:

忠于自己心中道德的人其实是最自私的,因为她\他可以为了道德而什么都不顾。

TOP

现有组数据(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吧~急着出门不好意思啦,有问题晚上回来再说。
CSUCHEN--追逐你的梦想

猪qoko如是说:

忠于自己心中道德的人其实是最自私的,因为她\他可以为了道德而什么都不顾。

TOP