Matrix中基于向量的消除零点

时间:2012-01-21 14:56:14

标签: arrays matlab vector matrix

我有一个类似

的矩阵
frequencyarray =

    697    697    697    697    697    697      0      0    697
      0      0      0      0      0      0    770    770      0
      0      0      0      0      0      0      0      0      0
      0      0      0      0      0      0      0      0      0
   1209   1209   1209   1209   1209   1209   1209   1209   1209
      0      0      0      0      0      0      0      0      0
      0      0      0      0      0      0      0      0      0

我现在想从它中消除向量基础上的所有零并得到这个

frequencyarray2 =

    697    697    697    697    697    697    770    770    697
   1209   1209   1209   1209   1209   1209   1209   1209   1209

如果向量中只有两个非零数字,我只想这样做。如果向量具有多于或少于两个非零数字,则应将它们替换为零。

因此,如果我有类似的东西:

frequencyarray =

      0      0    697    697
      0      0    770    770
      0      0      0      0
      0      0      0      0
   1209   1209   1209   1209
      0      0      0      0
      0      0      0      0

响应应该是:

frequencyarray2 =

      0      0      0      0

使用find,这不起作用,它只是在单个向量上完成所有操作。我想过使用find然后重塑。但是,只有当每个矢量恰好两个数字不为零时,这才有效。

如果可能的话,我想避免循环。列之间没有任何关系。

赞赏任何想法

3 个答案:

答案 0 :(得分:2)

您可以同时使用sumfind。类似的东西:

frequencyarray(sum(frequencyarray==0)==2)

答案 1 :(得分:1)

一个有用的代码段来比较两行:

all( (frequencyarray(i,:) == 0) & (frequencyarray(i+1,:) ~= 0) ) 

当以下行中的所有0都为非零时,它将为真。线对比是矢量化的 - 尽管你必须在阵列中移动。

加入您可以使用的行:

i_cand = (frequencyarray(i,:) == 0
joined_line = frequencyarray(i,:); % start
joined_line(~icand) = frequencyarray(i+1,~icand); % end of joining

答案 2 :(得分:0)

嗯......我已经解决了这个问题。即使不是我想要的方式,但它有效...而且它不一定非常快。

如果有人有兴趣,这是我的解决方案:

function [collapsed] = collapse(frequencies)
    fsize = size(frequencies,2);
    collapsed = zeros(2,fsize);
    for it=1:fsize
        col = frequencies(:,it);
        nonzero = frequencies(find(col != 0));
        if (size(nonzero,1) == 2)
            collapsed(:,it) = nonzero;
        endif
    endfor
endfunction