2016-01-10 103 views
-2

我想有人用MATLAB的知识来帮我整理了这一点,该计划是写一个脚本如下enter image description here几个操作在一个矩阵Matlab的

列2和检查开始读取数在柱3如果一个重复它们: 的条件是,如果在列中的数字被重复2多于一次柱3,相应的值在塔4或概括起来,如果未重复从塔2的数仅重复1次柱3,在塔4其相应的值将被保持原样。获得的值将在向量中生成。字母放在那里只是为了解释这里是一个例子,试试

data=[0 1 0  0 
     1 2 1 200 
     2 3 1 300 
     3 4 1 400 
     4 5 2 500 
     5 6 3 600 
     6 7 4 700 
     7 8 5 800 
     8 9 5 900 
     9 10 5 1000 
     10 11 6 1100 
     11 12 7 1200 
     12 13 7 1300]; 

v=[(200+300+400) 200 300 400 (800+900+1000) 600 (1200+1300) 800 900 1000 1100 1200 1300] 

等待任何ideas.Thank你的程序员!

+0

数据将在输出是什么,这个'data'例子吗? –

+2

您能否提供您尝试过的代码并详细说明您使用它的一些问题? – Suever

+0

我只是无法计算如何将给定的条件转换为matlab代码,我添加了希望的结果 – gabby113

回答

1

如果我们打破你的问题,我们可以找出一个方法来得到你的答案。

从本质上讲,在第2列(data(:,2))每一个值,我们创建了发现第3列(data(:,2))所有值与之匹配的逻辑矩阵:

toinclude = data(:,3) == data(k,2) 

现在我们需要看多少场比赛有

matches = sum(toinclude) 

如果<2匹配,那么我们只需使用的值,否则我们总结列中的所有值4

if matches < 2 
    value = data(k,4) 
else 
    value = sum(data(toinclude, 4)); 
end 

而且我们希望在第2列

所有这一切都可以写成一个for循环来做到这一点的所有元素,但可能有一个在线的解决方案。

output = zeros(size(data, 1), 1); 

for k = 1:size(data,1) 
    toinclude = data(:,3) == data(k, 2); 

    if sum(toinclude) < 2 
     output(k) = data(k, 4); 
    else 
     output(k) = sum(data(toinclude, 4)); 
    end 
end 

为您提供这会产生以下结果

 900 
    200 
    300 
    400 
    2700 
    600 
    2500 
    800 
    900 
    1000 
    1100 
    1200 
    1300 
+0

嘿乔纳森S thanx为快速回答,您提到的详细信息已提供(不重复或只重复一次时间),因此如果第2列中的值不存在于第3列中,则该值将被视为与第3列中重复的一次相同。我已经试过你发布的代码与期望的输出不符,但总体来说,无论如何 – gabby113

+0

@ gabby113我刚刚根据你的澄清编辑了我的答案。请检查并让我知道它是如何发生的。 – Suever

+0

k有初始值吗?我得到这个错误?未定义的函数或变量'k'。 – gabby113