我正在研究组合问题。
鉴于 A 是 m1 xn 矩阵, C 是每个单元格的 m2 xn 单元格数组包含行向量。
问题陈述
我想,但我不知道如何构建一个函数 C = vecfactor(A),以便所有(所有(sortrows(A,1:n)) == sortrows(B,1:n)))== 1 其中 B 由
构建B = [];
for J = 1 : m2
newmat = combvec(cell2mat(C(J,1)),cell2mat(C(J,2)),cell2mat(C(J,3)), ...
cell2mat(C(J,4)),cell2mat(C(J,5)));
B = [B; transpose(newmat)];
end
我想做的例子
如果输入 A 是
A =
0 1 3 0 1
0 1 0 0 1
0 1 0 1 1
1 0 3 0 1
0 2 0 0 1
2 0 3 0 0
0 0 0 0 1
0 0 3 0 1
2 2 0 0 1
3 0 3 0 1
0 1 0 0 2
然后我希望输出 C 看起来像这样(行的顺序无关紧要):
C =
{[1,0,3] [0] [3] [0] [1];
[0] [1,0] [3,0] [0] [1];
[0,2] [2] [0] [0] [1];
[0] [1] [0] [1] [1];
[0] [1] [0] [0] [2]}
为什么 C 看起来像这样?
的垂直连接transpose(combvec([1,0,3],[0],[3],[0],[1]))
transpose(combvec([0],[1,0],[3,0],[0],[1]))
transpose(combvec([0,2],[2],[0],[0],[1]))
transpose(combvec([0],[1],[0],[1],[1]))
transpose(combvec([0],[1],[0],[0],[2]))
排序后,的 A AND 的大小与 A 相同。
如果没有编程
我该怎么办?这是另一方面对我的问题的另一个澄清。 这就是我尝试从手上 A 获取 C 的方式。
1)计算矩阵行 A 。
A =
0 1 3 0 1 --- row 1
0 1 0 0 1 --- row 2
0 1 0 1 1 --- row 3
1 0 3 0 1 --- row 4
0 2 0 0 1 --- row 5
2 0 3 0 0 --- row 6
0 0 0 0 1 --- row 7
0 0 3 0 1 --- row 8
2 2 0 0 1 --- row 9
3 0 3 0 1 --- row 10
0 1 0 0 2 --- row 11
2)找出 A 的行集,以便每个集合都是combvec的结果。
Consider the rows 4, 6, 10:
1 0 3 0 1 --- row 4
0 0 3 0 1 --- row 6
3 0 3 0 1 --- row 10
此矩阵与
的输出相同transpose(combvec([1, 0, 3], [0], [3], [0], [1]))
所以,一行C是[1,0,3],[0],[3],[0],[1]。
Consider the rows 1, 2, 7, 8
0 1 3 0 1 --- row 1
0 1 0 0 1 --- row 2
0 0 3 0 1 --- row 7
0 0 0 0 1 --- row 8
此矩阵与
的输出相同transpose(combvec([0], [1, 0], [3, 0], [0], [1]))
所以,另一行C是[0],[1,0],[3,0],[0],[1]。
虽然第5行也是0 _ _ 0 1的形式,但是没有办法使用combvec一次生成第1,2,5,7,8行,所以第5行不能与它们分组。
相反,第5行可以用9分组:
0 2 0 0 1 --- row 5
2 2 0 0 1 --- row 9
因为它们构成了
的输出transpose(combvec([0, 2], [2], [0], [0], [1]))
所以,C的另一行是[0,2],[2],[0],[0],[1]。
第3行不能与其他行形成一组combvec输出。 因此,[0],[1],[0],[1],[1]形式的第3行应该是C行。
第11行和第2行一起构成
的输出transpose(combvec([0],[1],[0],[0],[1, 2]))
但是,由于第2行已包含在另一组中,因此第11行和第2行不能组合在一起。第11行应该是单独的,形式为[0],[1 ],[0],[0],[2]也应该是一行C.
所以矩阵 A ,经过这样的计算,将返回一个单元格数组 C :
C =
{[1,0,3] [0] [3] [0] [1]; ---correspond to row 4, 6, 10 of A
[0] [1,0] [3,0] [0] [1]; ---correspond to row 1, 2, 7, 8 of A
[0,2] [2] [0] [0] [1]; ---correspond to row 5, 9 of A
[0] [1] [0] [1] [1]; ---correspond to row 3 of A
[0] [1] [0] [0] [2]} ---correspond to row 11 of A
进行转换的方法可能不止一种。但是我想要一个行数最少的输出。
上例中的输入大小仅为11 x 5,无需编程即可轻松完成。但是我需要转换的矩阵实际上是10000×10的大小,所以没有编程就很难执行它。
有人能就我如何做到这一点给我一些意见吗?