Matlab-如果条件满足
问题描述:
我有这样的一个变量,它是所有一行移动号码的新行:Matlab-如果条件满足
我想写一个for循环,会发现其中数小于前一个,把数字的休息,新行,这样
1 2 3 4 5 6 7 8 9
2 4 5 6
5
我已经试过这样:
test = [1 2 3 4 5 6 7 8 9 2 4 5 6 5];
m = zeros(size(test));
for i=1:numel(test)-1;
for rows=1:size(m,1)
if test(i) > test(i+1);
m(i+1, rows+1) = test(i+1:end)
end % for rows
end % for
但它显然是不正确的,只是挂起。
答
让x
是您的数据载体。你想,可以很简单地做什么如下:
ind = [find(diff(x)<0) numel(x)]; %// find ends of increasing subsequences
ind(2:end) = diff(ind); %// compute lengths of those subsequences
y = mat2cell(x, 1, ind); %// split data vector according to those lenghts
这产生单元阵列y
期望的结果。使用单元格数组,以便每个“行”可以具有不同数量的列。
例子:
x = [1 2 3 4 5 6 7 8 9 2 4 5 6 5];
给
y{1} =
1 2 3 4 5 6 7 8 9
y{2} =
2 4 5 6
y{3} =
5
答
如果你正在寻找一个数字阵列输出,您将需要填补“空白”的东西,并与zeros
填充似乎是一个好选项,就像你在代码中做的那样。
所以,这里有一个bsxfun
基础的方法来达到同样的 -
test = [1 2 3 4 5 6 7 8 9 2 4 5 6 5] %// Input
idx = [find(diff(test)<0) numel(test)] %// positions of row shifts
lens = [idx(1) diff(idx)] %// lengths of each row in the proposed output
m = zeros(max(lens),numel(lens)) %// setup output matrix
m(bsxfun(@le,[1:max(lens)]',lens)) = test; %//'# put values from input array
m = m.' %//'# Output that is a transposed version after putting the values
输出 -
m =
1 2 3 4 5 6 7 8 9
2 4 5 6 0 0 0 0 0
5 0 0 0 0 0 0 0 0