如何在矩阵列中获取最后一个非零值的数组?

时间:2017-12-27 10:19:56

标签: arrays matlab matrix vector find

我有一个矩阵M

M = [0,11,111;...
     0, 0,222;...
     0,33,  0;...
     4, 0,  0;...
     5, 0,  0]

我想要一个具有每列的最后非零值的向量。

nzvals = [5,33,222]  % how do I get this programatically?  

find(a)为我提供了所有非零的索引没有列上下文
更糟糕的是,find(a,1,'last')给了我一个索引 nonzeros = M>0为我提供了一个指标矩阵,其中1表示非零值。但我不知道如何使用它来获取列的最后一个非零值。

也许以某种方式[~,idx] = unique(a,'last') > 0

或者我需要以某种方式使用index construction吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:4)

反转矩阵,通过negating将其转换为逻辑,以分别将非零和零转换为falsetrue。现在使用min查找每列最小值的索引。这将在倒置矩阵的每列中找到第一次出现false的索引。注意,反转矩阵中第一次出现false与原始矩阵中最后出现的非零相同。现在使用这些索引和diag来提取所需的值。

或者,您可以在应用min后使用max并查找false元素,而不是使用true并查找logical元素。将零转换为false,将非零转换为true)。

nzvals  = M(end:-1:1,:);
[~, ind] = min(~nzvals,[],1);   %Alternatively: [~, ind] = max(logical(nzvals),[],1);  
nzvals =  diag(nzvals(ind,:));