我在MATLAB中有一个带零的矩阵,我希望得到另一个矩阵N,每行有第一个非零元素.比方说,例如N = 3,矩阵是
A = [ 0 0 2 0 6 7 9;
3 2 4 7 0 0 6;
0 1 0 3 4 8 6;
1 2 0 0 0 1 3]
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
B = [2 6 7;
3 2 4;
1 3 4;
1 2 1]
Run Code Online (Sandbox Code Playgroud)
我有一个巨大的矩阵,所以我想没有循环,你能帮助我吗?非常感谢!
由于MATLAB根据列主要顺序存储矩阵,我首先转置A,冒泡非零,然后选择第一N行,并转置回:
N = 3;
A = [ 0 0 2 0 6 7 9;
3 2 4 7 0 0 6;
0 1 0 3 4 8 6;
1 2 0 0 0 1 3];
Run Code Online (Sandbox Code Playgroud)
转置和预分配输出B.
At = A';
B = zeros(size(At));
At =
0 3 0 1
0 2 1 2
2 4 0 0
0 7 3 0
6 0 4 0
7 0 8 1
9 6 6 3
Run Code Online (Sandbox Code Playgroud)
索引零
idx = At == 0;
idx =
1 0 1 0
1 0 0 0
0 0 1 1
1 0 0 1
0 1 0 1
0 1 0 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
冒泡非零
B(~sort(idx)) = At(~idx);
B =
2 3 1 1
6 2 3 2
7 4 4 1
9 7 8 3
0 6 6 0
0 0 0 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
选择第一N行并转置回来
B(1:N,:)'
Run Code Online (Sandbox Code Playgroud)
您可以按行主要顺序进行冒泡,但是您需要使用find检索行和列下标,并在那里进行一些排序和选择.它变得更乏味,更不易阅读.