我正在使用MATLAB编写一个乘以多项式的代码。我的代码的大多数部分都有效,但有一部分我有两个行向量a
和b
。我想删除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)
已添加两次,只应添加一次。
我不应该使用任何内置函数,有没有办法轻松解决这个问题?
答案 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