[英]finding the first non zero column in a 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]
我怎样才能做到这一点 ?
嘿,这是我能想到的用于获取所有非零元素的最简单的代码:
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);
您可以遍历各列并使用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
您的问题尚不清楚,但这似乎可以满足您的要求(因为所有其他列均为零):
flipud(nonzeros(A))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.