如果条件重复以前的行

3视图(30天)
戴夫
戴夫 2015年2月18日
评论道: 大卫年轻 2015年2月19日
你好,我有一个nx2矩阵,第一列的顺序,10 20 30 40然后再重复,但如果没有观察它跳跃到下一个(比如如果没有40然后10 20 30 10 20 30 40 ....)
我需要的是重复的在前面行是什么情况没有去年(40)或下最后(30):
)如果没有40但有30,然后创建行40 - 30日在第二列的重复元素。
B)如果没有40 - 30但有20个,然后创建一行30和40,20在第二列的重复元素。
C)如果没有30但有20个,然后creaste行30和20在第二列的重复元素。
我给一个例子与矩阵M1低于上述3例。
原始矩阵M1是12 x2
M1 = [
10 44;
20 72;
30 21;
40 13;
10 32;
20 26;
30 55;
10 23;
20 98;
10 36;
20 84;
40 22)
新矩阵M2是16 x2
M2 = [
10 44;
20 72;
30 21;
40 13;
10 32;
20 26;
30 55;
40 55;
10 23;
20 98;
30 98;
40 98;
10 36;
20 84;
30 84;
40 22)
在M2自第一周期10 20 30 40 M1是好的没有增加。
但在M1第二周期没有40岁,所以M2创建行40 - 30的重复元素。
第三周期没有30或40,但有20,所以创建20 30和40和重复的元素。
第四周期没有30所以创造30和20的重复元素(注意40不是感动)
请帮忙
1评论
戴夫
戴夫 2015年2月18日
由于dpb,我现在也许是更容易的问题:
我提前知道我的目标矩阵的维度M2 (16 x2),所以我将使用此。
我改变了M1维度,所以总是10 20 30 40。但当没有在第二列元素,它读取NaN
数M1b说,现在M1
数M1b = [
10 44;
20 72;
30 21;
40 13;
10 32;
20 26;
30 55;
40南;
10 23;
20 98;
30南;
40南;
10 36;
20 84;
30南;
40 22)
所以我的目标仍然是矩阵M2,需要替换南与先前只有持有的标准。南取代仅仅适用于30和40例。比如如果有在20你就让它南南。

登录置评。

接受的答案

大卫年轻
大卫年轻 2015年2月18日
编辑:大卫年轻 2015年2月18日
%的参数
cycleLength = 4;%的行数在一个循环
indexMult = 10;%乘数在周期指数
订单= M1 (: 1);
%得到输出行索引
印第安纳州= cycleLength * (cumsum(订单= = indexMult) - 1) +订单/ indexMult;
%在输出矩阵的行数,这样完全循环结束
indlast =装天花板(印第安纳州(结束)/ cycleLength) * cycleLength;
indall = 1: indlast;
%建立输出矩阵和调整指标分配给第一列
M2 = 0 (indlast, 2);
平方米(:1)= indexMult * (mod (indall-1 cycleLength) + 1);
%将数据放入正确的行第二列
平方米(印第安纳州,2)= M1 (:, 2);
%传播缺失的数据——第一个元素在每个缺口
跳= diff([印第安纳州;indlast + 1]);
gappos =印第安纳州(跳跃> 1);
平方米(gappos + 1, 2) =平方米(gappos 2);
%传播缺失的数据,第二个元素在双缺口
gappos =印第安纳州(跳跃> 2);
平方米(gappos + 2, 2) = M2 (gappos + 1, 2);
%假设没有差距超过2元素
3评论
大卫年轻
大卫年轻 2015年2月19日
哦等等,到底你想如果20日周期30和40人失踪?所有南,或者所有副本的10个值,或别的东西吗?我会等待直到我做出改变需要知道结果。

登录置评。

答案(1)

dpb
dpb 2015年2月18日
我从来没有这样神奇的子弹
> > idx =找到(diff ([0;米(:1)])> 0 & diff ([0;米(:1)])~ = 10)|
(diff ([0;米(:1)])< 0 & diff ([0;米(:1)])~ = -30))
ans =
8
10
12
给你指标向量的位置缺少一个或多个值。最好的我是然后走透这个数组,检查位置和之前使用的区别,控制参数 repmat 调用。
你可以做的一件事是建立一个新的M数组先验,第一列是干净的 (* ),当你工作通过现有的新行向量的目标,与此同时你复制那些没有失踪,直到上面列表中的下一个元素。
一定会 accumarray 可以帮助但我有其他的承诺,防止花更多的时间,对不起……
(* )即。10,如果总是存在,那么新数组可以建成
nReps =总和(M (: 1) = = 10);%多少组?
N = 0 (nReps 2);%一个新的完整的数组
N (: 1) = repmat ([10:10:40]。nReps, 1);%填补第一列

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!