我有一个类似
的矩阵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然后重塑。但是,只有当每个矢量恰好两个数字不为零时,这才有效。
如果可能的话,我想避免循环。列之间没有任何关系。
赞赏任何想法
答案 0 :(得分:2)
您可以同时使用sum
和find
。类似的东西:
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