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,所以你想输入一个接受间隔:If
My2ndColumn=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);