您好我需要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
代码必须执行以下操作:
所以输出看起来像这样:
12 8 3 26 3 6
26 19 3 35 4 3
NaN NaN NaN NaN NaN NaN
50 45 2 71 8 10
感谢您的帮助。非常感谢:)。
答案 0 :(得分: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+1
或cI+minI+1
超过元素数量,则会出现类似的错误检查。如果您要查找的更改发生得太晚,就会发生这种情况。
首先,您可以在每一行(for
)上设置i
循环,但必须有更好的方法来对代码进行矢量化。
整个事情设置为使用for
- 循环
% 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