【问题标题】:How can I delete unwanted zeros from a matrix in matlab?如何从matlab中的矩阵中删除不需要的零?
【发布时间】:2022-01-24 22:20:21
【问题描述】:

我有一个这样的矩阵:

 1     5     7     3     1     0
 1     8     1     0     0     0
 2     4     6     2     0     0
 2     9     10    2     0     0
 0     0     0     0     0     0

我想改成...

 1     5     7     3     1     
 1     8     1         
 2     4     6     2     
 2     9     10    2     
 

请帮帮我

【问题讨论】:

  • 写这样一个函数其实很简单
  • 你能帮我写那个函数吗?!请
  • 后者不是矩阵,因为某些行的长度不同。你可以接受后者是一个元胞数组吗?
  • 没关系。后者可以是元胞数组。

标签: matlab matrix


【解决方案1】:

如果输出可以是一个元胞数组,那么这样的事情就可以了。

% assume input is the first matrix
output = cell(size(input,1), 1);
for i = 1:length(output)
    output{i} = input(i, input(i, :) ~= 0);
end

这样做是创建一个与原始行数相同的元胞数组,然后遍历原始数组,找到非零条目并保留它们。

您可以只保留非零值而不保留任何行信息,如下所示:

output = input(input ~= 0);

这使用线性索引并将矩阵展平为向量。

【讨论】:

  • 哇。非常感谢
【解决方案2】:

为了多样化,这里有一个不使用循环的方法:

in = [1 5 7 3 1 0; 1 8 1 0 0 0; 2 4 6 2 0 0; 2 9 10 2 0 0; 0 0 0 0 0 0]; % example data
[~, inds, vals] = find(in.'); % column indices and values of nonzeros of transposed input
result = accumarray(inds, vals, [size(in,1) 1], @(x){x.'}); % group by index

要了解它的工作原理,您可能需要阅读 find 和 accumarray 函数以及 this answer 的文档以了解为什么需要转置。

【讨论】:

  • 非常感谢
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多