在矩阵的每一行中找到前N个非零元素

Mar*_*ria 3 matlab matrix

我在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)

我有一个巨大的矩阵,所以我想没有循环,你能帮助我吗?非常感谢!

Ole*_*leg 5

由于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检索行和列下标,并在那里进行一些排序和选择.它变得更乏味,更不易阅读.