循环去除向量的重复元素并添加另一个向量的相应元素

时间:2014-03-07 20:52:51

标签: arrays matlab

我正在使用MATLAB编写一个乘以多项式的代码。我的代码的大多数部分都有效,但有一部分我有两个行向量ab。我想删除a的重复元素,然后添加b的相应元素。这就是我写的

c=length(a);
d=length(b);
remove=[];
for i=1:c
    for j=i+1:c
        if (a(i)==a(j))
            remove=[remove,i];
            b(j)=b(i)+b(j);
        end
    end
end
a(remove)=[];
b(remove)=[];

这个问题是如果a中的元素出现两次以上,则无法正常工作。 例如,如果a=[5,6,8,9,6,7,9,10,8,9,11,12]b=[1,7,1,-1,3,21,3,-3,-4,-28,-4,4] 然后,一旦运行此代码a变为[5,6,7,10,8,9,11,12]这是正确的,但b变为[1,10,21,-3,-3,-27,-4,4]这是正确的,除了-27应该是-26。

我知道为什么会发生这种情况,因为a(1,4)中的9与a(1,7)中的9进行了比较,因此b(1,7)变为b(1,7)+b(1,4),然后a(1,4)a(1,10)中的9。然后,a(1,7)a(1,10)进行比较,因此新的b(1,7)会添加到b(1,10),但b(1,4)也会添加到b(1,10)。一旦找到一个重复的元素,我就会以某种方式停止此操作,因为此处b(1,4)已添加两次,只应添加一次。 我不应该使用任何内置函数,有没有办法轻松解决这个问题?

2 个答案:

答案 0 :(得分:1)

我更喜欢使用内置函数,但假设你必须坚持自己的方法,你可以试试这个:

a=[5,6,8,9,6,7,9,10,8,9,11,12];
b=[1,7,1,-1,3,21,3,-3,-4,-28,-4,4];

n = numel(a);
remove = zeros(1,n);

temp = a;
for ii = 1:n
    for jj = ii+1:n
        if temp(ii) == temp(jj)
            temp(ii) = NaN;
            remove(ii) = ii;
            b(jj) = b(jj) + b(ii);

        end
    end
end

a(remove(remove>0)) = []
b(remove(remove>0)) = []

a =
     5     6     7    10     8     9    11    12
b =
     1    10    21    -3    -3   -26    -4     4

与您的方法没什么不同,除非更改ii的{​​{1}}值,如果以后找到它。为了避免用a覆盖a中的值,我正在使用临时变量。

此外,正如您所看到的,我正在避免NaN,因为这将创建一个增长的向量,这非常慢。

答案 1 :(得分:0)

它可以通过以下索引噩梦以矢量化的方式解决(也许有人会提出一种更简单的方法):

a = [5,6,8,9,6,7,9,10,8,9,11,12];
b = [1,7,1,-1,3,21,3,-3,-4,-28,-4,4];

[sa, ind1] = sort(a);
[~, ii, jj] = unique(sa);
[ind2, ind3] = sort(ind1(ii));
a = a(ind2);
b = accumarray(jj(:),b(ind1)).';
b = b(ind3);

无论如何,要乘以多项式,可以使用conv

>> p1 = [1 3 0 2];                      %// x^3 + 3x^2 + 1
>> p2 = [2 -1 4];                       %// 2x^2 - x + 4
>> conv(p1,p2)
ans =
     2     5     1    16    -2     8    %// 2x^5 + 5x^4 + x^3 + 16x^2 - 2x + 8