matlab - 将矩阵转换为堆叠向量,其中删除每行最后一个非零值之后的所有零

标签 matlab matrix vector vectorization

我有一个矩阵,其中有一些我想删除的零值。

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/

相关文章:

c++ - matlab 代码生成中支持的函数

matlab - 生成量化矩阵

Matlab:如何检索 plotyy 的标题、xlabel、ylabel 和字体?

R:如何在列表中应用求和函数?

c++ - 一个类使用第二个类,第二个类使用第一个类中定义的结构

macos - 创建 Matlab 运行行快捷方式(如 R)

r - 如何将JPEG转换为R中的图像矩阵

r - 如何按比例填充矩阵?

c++ - 初始化 vector 的多个(唯一)条目

c++ - Vector 不是 std 的成员,包含所有内容