Arrays 循环以删除向量的重复元素并添加另一个向量的相应元素
我正在使用MATLAB编写一个多项式乘法的代码。我的大部分代码都可以工作,但是有一部分我有两个行向量Arrays 循环以删除向量的重复元素并添加另一个向量的相应元素,arrays,matlab,Arrays,Matlab,我正在使用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 en
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=[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,-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)
已经添加了两次,而它应该只添加一次。
我不应该使用任何内置函数,有没有办法轻松解决这个问题?我更喜欢使用内置函数,但假设您必须坚持自己的方法,您可以尝试以下方法:
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
它与您的方法没有太大区别,除了更改a
的ii
th值(如果以后发现)。为了避免用NaN
覆盖a
中的值,我为此使用了一个临时变量
此外,如您所见,我正在避免使用
remove=[remove I]
,因为这将创建一个增长非常缓慢的向量。可以通过以下索引噩梦以向量化的方式解决它(也许有人会想出一个更简单的方法):
无论如何,要乘以多项式,您可以使用:
为什么不想使用内置函数?家庭作业?我想他不应该使用任何内置功能。谢谢你的帮助。你能解释一下步骤温度(ii)=NaN;是吗?它将
temp
的ii
th元素替换为NaN
,这是表示非数字元素的MATLAB方法。这样,当您对相同的ii
和不同的jj
比较temp(ii)=temp(jj)
时,您将永远不会再得到true
(这是您的问题)。请注意,NaN==NaN
返回False
。
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);
>> 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