我有一个矩阵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吗?如果是这样,怎么样?
答案 0 :(得分:4)
反转矩阵,通过negating将其转换为逻辑,以分别将非零和零转换为false
和true
。现在使用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,:));