【问题标题】:matlab. finding specific values in matrix and looping.MATLAB。在矩阵中查找特定值并循环。
【发布时间】:2012-11-28 22:36:28
【问题描述】:

您好,我需要一些有关 matlab 的帮助。

我有一个 500 x 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% 的 delta 为 (1,3) = 12,最小值出现在 delta 20% 之后是 (1,6) = 8。经过的时间是 3。
  3. 然后代码从第 2 步中找到的最小值中查找最大值。在本例中,第 9 列的值为 26。它还记录了经过的时间。
  4. 最后,代码测量从第一个增量值到找到的最大值所用的时间。在这种情况下是从 (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

感谢您的帮助。非常感谢:)

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    我现在无法访问 matlab。但这里有一些步骤可以帮助您入门。 请仔细检查您的测试用例的答案,看看您是否得到了想要的结果。

    假设你有一个行向量x。在你的情况下说你的数据矩阵的ith 行,即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 超过元素个数,也会有类似的错误检查。如果您正在寻找的更改发生得太晚,就会发生这种情况。

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

    整个设置为使用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
    

    【讨论】:

    • 您好,感谢您的回复。代码有问题。 (:,1) 的结果只输出 data(:,1) 中的所有值,其余代码根据该结果计算。
    • @BernardUntalanJr。稍作修正,在 find 语句中将 0.2 替换为 1.2。现在代码给出的结果与您在问题中提到的相同。
    • @BernardUntalanJr。您能否更具体地说明失败的位置和方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多