Matlab如何在两个不同的向量中找到互数并替换它们?
救命啊 如何在两个不同的向量中找到互数并替换它们 我有这样的情况:Matlab如何在两个不同的向量中找到互数并替换它们?,matlab,Matlab,救命啊 如何在两个不同的向量中找到互数并替换它们 我有这样的情况: 2016 2059 43 2362 2450 88 2451 2474 25 2475 2684 36 3301 3332 31 当列1与第二列相差1或0,并且列号3必须添加值时,我希望获得开始和结束,如下面的示例所示。我为我的错误解释道歉,伙计们 这是我想要得到的输出 2016 2059 43 2362 2684 149 3301 33
2016 2059 43
2362 2450 88
2451 2474 25
2475 2684 36
3301 3332 31
当列1与第二列相差1或0,并且列号3必须添加值时,我希望获得开始和结束,如下面的示例所示。我为我的错误解释道歉,伙计们
这是我想要得到的输出
2016 2059 43
2362 2684 149
3301 3332 31
这个答案和你的问题一样清楚:-) 这使得:
result =
2016 2059 43
2362 2684 149
3301 3332 31
假设你的三个向量是A,B,C:
[com,ia,ib]=intersect(A,B);
A1=setdiff(A,com);
B1=setdiff(B,com);
C1=C;
for k=fliplr(1:length(ib))
C1(ib(k)+1)=C1(ib(k))+C1(ib(k)+1);
C1(ib(k))=[];
end
A1、B1、C1是结果向量,这里是带循环的解。只要检查
第2列
中的每个值,如果它也出现在第1列
。如果是这样,我将第3列中的值添加到中,并替换OP中示例中给出的值。
最后两行删除所有现在为0的值(已替换的值),并将A
重塑为原始形式,因为另一个comand将A
作为一维向量返回
A = [2016 2059 43;
2362 2450 88;
2450 2474 25;
2474 2684 36;
3301 3332 31];
for k=1:5
for l=2:1:5
if A(l,1)==A(k,2)
A(l,3)= A(k,3)+A(l,3);
A(l,1)= A(k,1);
A(k,:) = 0;
break
end
end
end
A=A(A~=0);
A=reshape(A,numel(A)/3,3);
前两列是否已排序?第二列比第一列大吗?你应该更好地解释第三列的数字added@LuisMendo我认为他需要一个“回溯”检查,如果第2列中的值也存在于第1列中。如果是,则使用相应的第2列值覆盖它,并添加2个相应的第3列值。在他给出的示例中,2362
的“第一个新”第2列值应该是2474
。所以他加了88+25
。然后,他看到“第一个新”列2值再次存在于列1中。所以他又重写了。导致[2362 2684 88+25+36=149]
output@TheMinion谢谢是的,这是这个例子中最有可能得出的结论。但我宁愿在尝试回答之前澄清这一点,在这里,经典for循环不起作用吗?+1用于注释:-我不确定如果有多组连接,这是否起作用,但这可能是固定的。漂亮,+1汉克斯。我试过了,但不是很复杂的案子。无论如何,@Luis解决方案似乎更快…非常感谢。我是新来的,和Matlab在一起谢谢你们。很抱歉我的解释不好:)真的很抱歉。这些解决方案很有效,这正是我一直在寻找的。我也想问你这个问题。x=2016 2059 43 2362 2450 88 2451 2474 25 2474 2684 36 3301 3332 31];在这里,一个数据和另一个数据的差异是一或零。我想得到这个[2016 2059 43 2362 2684 149 3301 3332 31]@user3710685,所以你想输入一个接受间隔:IfMy2ndColumn=My1stColumn+-interval
做某事。只需使用If
-参数。您可以将其更改为A(l,1)==A(k,2)| A(l,1)==A(k,2)+1
,这将检查它是否等于或大于示例中给出的1。但是如果你想要一个真正的接受间隔,你可以这样做:a(l,1)=a(k,2)-间隔
那么当设置interval=1
时,你应该检查它是否等于正负1。否则,只需使用if用例和逻辑运算符即可。键入,即帮助&
以获取它们的列表;)Minion如果我使用更多的数据,它会给我3*n,但我希望在reshape@user3710685你是对的。修正了,我在最后一行搞错了
A = [2016 2059 43;
2362 2450 88;
2450 2474 25;
2474 2684 36;
3301 3332 31];
for k=1:5
for l=2:1:5
if A(l,1)==A(k,2)
A(l,3)= A(k,3)+A(l,3);
A(l,1)= A(k,1);
A(k,:) = 0;
break
end
end
end
A=A(A~=0);
A=reshape(A,numel(A)/3,3);