2012-11-27 85 views
0

嗨,我需要一些matlab的帮助。matlab。在矩阵和循环中查找特定值。

我有这是500×360下面的矩阵是一个示例数据集:

10 10 12 11 9 8 8 25 26 26 20 20 20 
20 22 26 20 20 19 30 31 33 35 33 32 
30 30 29 31 32 33 31 33 33 32 31 31 
40 50 49 45 47 47 45 65 68 69 70 71 

该代码具有执行以下操作:

  1. 查找我指定值的第一次出现,在这种情况下是20%的变化。因此,观察(1,:),第一次出现20%的变化位于第2列和第3列之间。
  2. 然后,它识别在步骤1中指定的值之后发生的最低值。在这种情况下,列6即8的值)。代码然后测量从步骤1中指定的值到步骤2中发生的最低值所经过的时间。回顾这个例子,20%的增量是(1,3)= 12,最小值是增量20%经过的时间是3.
  3. 该代码然后从步骤2中找到的最低值中找到最高值。在这种情况下,第9列的值为26.它还记录时间过去。
  4. 最后,代码测量从第一个delta值到找到的最高值所经过的时间。在这种情况下是从(1,3)到(1,9)的时间是6

所以输出会是这个样子:

12 8 3 26 3 6 
26 19 3 35 4 3 
NaN NaN NaN NaN NaN NaN 
50 45 2 71 8 10 

我感谢你的帮助。非常感谢:)

回答

1

我现在无法访问matlab。但是这里有一些让你开始的步骤。 请仔细检查您的测试用例的答案,看看您是否获得了期望的结果。

假设你有一排矢量x。在你的情况说,你的数据矩阵的i个行即x = data(i,:);

我们发现(比方说)20%的变化的第一次出现,你可以使用:

cI = find(x >= x(1)*1.2, 1, 'first'); 

其中cI将是第一的指数值大于20%的变化,x(cI)是必需的值。

旁边找到这个值后的最小使用

[minV, minI] = min(x((cI+1):end)); 

,并找到后,最大:

[maxV, maxI] = max(x((cI+minI+1):end)); 

终于到一起放:

[x(cI), minV, minI, maxV, maxI, (minI + maxI)] 

这将为你的第一排工作。现在对于第三行,您需要确保cI有一个值。如果cI为空,则只需使用NaN(1,6)

会有类似的错误检查,如果cI+1cI+minI+1超过元素的数量。如果您正在寻找的变化发生得太晚,就会发生这种情况。

首先,您可以在每一行上设置for -loop(i),但是必须有更好的方法来向量化代码。

整件事设置为使用for -loop

% I have used generic variable names. Change them to something meaningful. 
data = rand(500,360); % Use your data 
change = 0.2; % or 20/100 if you prefer percentage 
[nROWS, nCOLS] = size(data); 
result = NaN(nROWS, 6); % Defining it this way saves the trouble to having to assign NaNs 

for row = 1:nROWS 
    x = data(row, :); % Not required, but easy to write code 

    cI = find(x >= x(1)*(1+change), 1, 'first'); 
    if isempty(cI) 
     continue; 
    end 
    if cI == nCOLS % no more elements to find min and max from 
     result(row, 1) = x(cI); 
     continue; 
    end 

    [minV, minI] = min(x((cI+1):end)); 
    if (cI + minI) == nCOLS % no more elements to find max from 
     result(row, 1:3) = [x(cI), minV, minI]; 
    end 

    [maxV, maxI] = max(x((cI+minI+1):end)); 
    result(row, :) = [x(cI), minV, minI, maxV, maxI, (minI + maxI)]; 
end 
+0

您好,感谢响应。代码存在问题。 (:,1)的结果只是输出数据中的所有值(:,1),其余的代码将根据该结果进行计算。 – Buntalan

+0

@BernardUntalanJr。在发现声明中用0.2取代0.2。现在代码给出了与你在问题中提到的相同的结果。 – mythealias

+0

嗨,再次感谢,但它产生不良结果。 – Buntalan