我有一个50x3矩阵,并希望将第一列与另外两列的总和相反。即假设我们有A,B和C列。取A,我求和B和C.这样我有两列(50x2)。接下来,使用50x2矩阵我想重新排列A,使其与第二列(从添加B和C得到)相反。如果
,则两个向量a,b的顺序相反(a_j - a_k)(b_j - b_k) ≤ 0 , ∀ 1≤j,k≤N Where N=50,j=2.
例如 X = [15.2221,49.0000,12.3631; 20.3201,22.5702,30.6228; 12.1306,9.4257,10.3228; 16.1499,21.3606,11.5000; 16.6777,30.6228,13.4338]
使用第一列,取其他两列的总和。所以我们有一个新的矩阵 Y = [15.2221,61.3631; 20.3201,53.1930; 12.1306,19.7485; 16.1499,32.8606; 16.6777,44.0565]
重新排列第一列,只有
(y11-y12)(y21-y22)< = 0 y11-y13)(y21-y23)< = 0,e.t.c
最后我们有一个新的矩阵Y,其中第一列重新排列,而第二列保持不变。例如
Y = [15.2221,61.3631; 16.1499,53.1930; 20.3201,19.7485; 16.6777,32.8606; 12.1306,44.0565]
我希望你理解我的解释。我想导入到目前为止我在matlab上所做的事情,但我还在学习基础知识。
答案 0 :(得分:0)
首先,您需要2 x 50矩阵:
X =
[15.2221 49.0000 12.3631;
20.3201 22.5702 30.6228;
12.1306 9.4257 10.3228;
16.1499 21.3606 11.5000;
16.6777 30.6228 13.4338]
Xtransform = [X(:,1),(X(:,2)+X(:,3))]; %//This generates 2 by 50 Matrix
接下来你要重新排序第一列,以便(y11-y12)(y21-y22)< = 0(基于我的理解),所以对此进行一些数学运算:
您希望v1和v2的所有可能组合构建函数:
C1 = nchoosek(v1,2);
C2 = nchoosek(v2,2);
%//Do y11-y12
CC1 = C1(:,1) - C1(:,2);
%//Consider backwards
CB1 = C1(:,2) - C1(:,1);
%//Do y21-y22
CC2 = C2(:,1) - C2(:,2);
%//Consider backwards
CB2 = C2(:,2) - C2(:,1);
%//CC1 *CC2 should return negative or zero
CC = find(CC1.*CC2 < 0);
CB = find(CB1.*CC2 < 0);
%//The indexes returned are possible v1 and v2 combinations that fullfills the required function.
所以我达到了这一点,并想知道如果这个问题可以满足多种解决方案。如果有多个排序完全填充函数,那么订购它的正确方法是什么?
有了索引,您可以查看C1和C2,看看哪个ajk和bjk值满足函数。