我有一个矩阵,其中有一些我想删除的零值。
a=[ 1 2 3 0 0; 1 0 1 3 2; 0 1 2 5 0]
>>a =
1 2 3 0 0
1 0 1 3 2
0 1 2 5 0
但是,我只想删除每行最后一个非零值之后的那些。
这意味着我想保留第一行的 1 2 3
,第二行的 1 0 1 3 2
和第二行的 0 1 2 5
第三个。
然后我想将剩余的值存储在一个向量中。在示例的情况下,这将导致向量
b=[1 2 3 1 0 1 3 2 0 1 2 5]
我想出的唯一方法涉及一个我想避免的 for
循环:
b=[];
for ii=1:size(a,1)
l=max(find(a(ii,:)));
b=[b a(ii,1:l)];
end
有没有办法向量化这段代码?
最佳答案
有很多方法可以做到这一点,这是我的方法:
arotate = a' %//rotate the matrix a by 90 degrees
b=flipud(arotate) %//flips the matrix up and down
c= flipud(cumsum(b,1)) %//cumulative sum the matrix rows -and then flip it back.
arotate(c==0)=[]
arotate =
1 2 3 1 0 1 3 2 0 1 2 5
=========================编辑=====================
刚刚意识到 cumsum 可以有方向参数,所以应该这样做:
arotate = a'
b = cumsum(arotate,1,'reverse')
arotate(b==0)=[]
此方向参数在我的 2010b 版本中不可用,但如果您使用的是 2013a 或更高版本,则应该可以使用。
关于matlab - 将矩阵转换为堆叠向量,其中删除每行最后一个非零值之后的所有零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37484469/