我有3列数据(一天中的小时数)
C1 C2 C3
01 05 00
05 09 06
11 11 10
16 17 14
20 22 18
我需要能够将其分成n×3矩阵,其中每行上的三个数字彼此相距+/- 2小时。 (每行的范围必须<= 4)
每列中的每个值只能使用一次,因此如果有多个组合使用相同的数字,则会忽略其中一个组合。
所以最终的结果是:
<05> 05 05 06(摘自 C1 中的第2位, C2 中的第1位, C3 中的第2位) 11 09 10(摘自 C1 中的第3名, C2 中获得第2名, C3中获得第3名)16 17 18(摘自 C1 中的第4位, C2 中的第4位, C3 中的第5位)
每列中的数据必须保留在最终矩阵的同一列中,例如 C1 中的16位需要位于最终矩阵的第一列。
我真的很难找到一种方法将它放入代码中,你能帮忙吗?
答案 0 :(得分:0)
我设法让这几乎在MATLAB中工作,我不认为它特别有效或聪明但它完成了工作。
然而,它依赖于第一列中的值,将其视为中点。
这意味着第2列和第3列中的允许点必须为+/-2
。
C1 中的值是下限(eg. 30)
而其他2个值比 C1 中的值高4的情况是被归类为无效,虽然它在技术上仍然是一种解决方案。
x = [1,5,0; 5,9,6; 11,11,10; 16,17,14; 20,22,18];
d=size(x); %Get the size in of x in the form [row,col]
rows=d(1); %Number Of Rows
cols=d(2); %Number Of Columns
clear d;
y = nan(rows,cols); %nan Matrix the same size as x used for the output
a = ones(1,cols); %Keep track of the current index in question in each column
c = 0; %Number of "matches" or rows that are valid in the output matrix
time = zeros(1,cols); %Keep track of the current values in each column
while(max(a)<rows+1) %For every row check that no index is invalid
time(1)=x(a(1),1); %Get the value in column1
b = 2; %column counter
skip=0; %Increment the counter for column 1 if this is true
while(b<cols+1&&~skip&&max(a)<rows+1) %For columns 2->cols, if we don't need to skip the value in column 1 and all the indexes are valid.
time(b)=x(a(b),b); %Get the value in column b at row a(b)
delta = time(b)-time(1); %work out the difference in value from the first column value that is selected
if(delta>2)
%Skip first column by 1
a(1)=a(1)+1; %Increment the counter for column 1
skip=1; %Return back to the first while loop
elseif(delta<-2)
%Skip b'th column by 1
a(b)=a(b)+1; %Increment the counter for column b
else
%Its valid
if(b==cols) %If at the last column and its valid
c=c+1; %Increment the match counter
y(c,:)=time(1:cols); %Set the c'th row of the output to what we've found
a=a+1; %Move onto next number in column 1
skip=1; %Start all over
else %Not at last column yet
b=b+1;
end
end
end
end
最终结果:
05 05 06
11 09 10
16 17 14
20 22 18
nan nan nan
答案 1 :(得分:-1)
虽然你说的是有三列值,但它们的行和列没有任何意义。实际上你只有一个数字列表:01,05,00,05,09,06,11,11,10,16,17,14,20,22,18。
然后你订购它们:00,01,05,05,06,09,10,11,11,14,16,17,18,20,22
然后你拿三个并看看它们的距离:00,01,05 =坏,01和05相距太远。 下一个号码。 01,05,05?不。下一个号码。 05,05,06?是。继续他们。 09,10,11?是。继续他们。 11,14,16?不。下一个号码。 14,16,17?是。你找到了一个解决方案:
05, 05, 06
09, 10, 11
14, 16, 17