Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 循环以删除向量的重复元素并添加另一个向量的相应元素_Arrays_Matlab - Fatal编程技术网

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

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

我正在使用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=[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