在矩阵中找到第一个非零列

时间:2014-05-30 08:40:05

标签: arrays matlab matrix

如果我有矩阵A,如下所示

2 0 0 0 0 0 
3 0 0 0 0 0
4 0 0 0 0 0
7 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 
0 0 0 0 0 0  

所有其他列始终为零

我想得到数组B = [7 4 3 2]

我该怎么做?

3 个答案:

答案 0 :(得分:1)

嘿,这是我能想到的最容易获得所有非零元素的代码:

test_matrix = [ 2, 0 , 0 ,0 ,0;...
    3, 0 , 0 ,0 ,0;...
    4, 0 , 0 ,0 ,0;...
    7, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0];

B = test_matrix(test_matrix ~= 0) %//rowwise non zeroelements

输出是我们需要转置它然后翻转它的列。 如果将4的位置更改为列中的另一个插槽,它将显示在输出数组B的末尾。如果要将最后一个非零元素作为第一个输出,则可以转置数组:

B=fliplr(B'); %//fliping first to last and so in ( for the transpose array)

如果您希望列有序,即使如上所述,4也是数组中的其他位置,请使用转置矩阵:

helper= test_matrix' %//(')transposing Matrix
C = helper(helper ~=0) %//Columnwise non zero-elements

如果每列有多个非零元素,则必须检查是否要按列或列方式列出它们:检查B和C定义。显然,C不是逆序,只需使用

 C=fliplr(C); %%//flipping first to last and so on

希望这能解释你所得到的所有问题。
结果:

test_matrix = [ 2, 0 , 0 ,0 ,0;...
    3, 0 , 0 ,0 ,0;...
    0, 0 , 4 ,0 ,0;...
    7, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0;...
    0, 0 , 0 ,0 ,0];

helper= sum(test_matrix');
C = helper(helper ~=0);
B = test_matrix(test_matrix ~= 0);

结果:

C= (7,4,3,2);
B= (4,7,3,2);

答案 1 :(得分:1)

您可以遍历列并使用find。我们来看看

M =
     0     0     1     0     0
     0     0     2     0     0
     0     0     3     0     0
     0     0     4     0     0
     0     0     0     0     0

作为我们的示例矩阵。

for i = 1:size(M,2)
    ind = find(M(:,i));
    if ind
        found = ind;
        break;
    end
end

会得到你

found = 
    1
    2
    3
    4

你可以翻转

found = found([end:-1:1])'

哪个会帮到你

found =
    4 3 2 1

答案 2 :(得分:1)

你的问题不清楚,但这似乎做你想要的(因为所有其他列都是零):

flipud(nonzeros(A))