如何从数组中删除零列

时间:2015-04-02 02:41:06

标签: matlab

我有一个类似于:

的数组
 0     2     3     4     0     0     7     8     0    10
 0    32    44    47     0     0    37    54     0    36

我希望删除所有

0
0

从此得到:

 2     3     4     7     8    10
32    44    47    37    54    36

我试过x(x == 0) = [] 但我明白了:

x =

 2    32     3    44     4    47     7    37     8    54    10    36

如何删除所有零列?

4 个答案:

答案 0 :(得分:4)

这是一个可能的解决方案:

x(:,all(x==0))=[]

答案 1 :(得分:3)

您使用x(x == 0) = [];采用了正确的方法。通过这样做,您将删除仍然可以形成2D矩阵的正确数量的元素,这实际上为您提供了非强零值的向量。您所需要做的就是将reshape矩阵恢复为原始形式,包含2行:

x(x == 0) = [];
y = reshape(x, 2, [])

y =

     2     3     4     7     8    10
    32    44    47    37    54    36

另一种方法是使用any

y = x(:,any(x,1));

在这种情况下,我们会查找非零的任何列,并使用这些位置索引到x并提取出相应的列。

结果:

y =

     2     3     4     7     8    10
    32    44    47    37    54    36

另一种更适合学术目的的方法是使用unique。假设您的矩阵具有所有正值:

[~,~,id] = unique(x.', 'rows');
y = x(:, id ~= 1)

y =

     2     3     4     7     8    10
    32    44    47    37    54    36

我们转置x以便每列成为一行,然后查找所有唯一行。矩阵需要具有所有正值的原因是因为unique的第三个输出按排序顺序为每个唯一行分配唯一ID。因此,如果我们有所有正值,那么将为所有零的行分配ID为1.使用此数组,我们搜索未赋值为1的ID,并使用这些ID索引到{{1}提取必要的列。

答案 2 :(得分:1)

您也可以使用sum。 对于列和任何具有零的列的求和,在求和之后也将为零。

sum(x,1)
ans =

    0   34   47   51    0    0   44   62    0   46

x(:,sum(x,1)>0)

ans =

    2    3    4    7    8   10
   32   44   47   37   54   36

答案 3 :(得分:0)

同样通过重塑./configure --enable-tui=yes make configure: error: no enhanced curses library found; disable TUI Makefile:9096: recipe for target 'configure-gdb' failed 如下:

nonzeros(x)