创建一个列数不断变化的矩阵

时间:2014-05-20 14:40:07

标签: arrays matlab matrix indexing

我尝试使用自制版本的peakfinder.m,使其可以与多个数组一起使用,而不是一次只使用一个数组,以获得更高的时间效率。 (http://www.mathworks.com/matlabcentral/fileexchange/25500-peakfinder

我有一个2D矩阵,我需要找到符号在第二维中是否发生变化。

dx0 = diff(x0,1,2); % Find derivative
dx0(dx0 == 0) = -eps; % This is so we find the first of repeated values
ind = find(dx0(:,1:end-1).*(dx0(:,2:end)) < 0)+1; % Find where the derivative changes sign

现在我的问题是它确实找到了导数变化符号的位置,但它是一个很大的向量。因此,如果标志在同一行中变化两次(或者连续不变),我就无法找到答案。

因此,如果x0的大小为1000x10,我希望ind的大小为1000xY,其中Y是它在每一行中改变符号的次数。我还需要知道x0的哪些值有符号变化。因此,每一行都将采用以下方式:

2 4 7
4 8
2 5 6 8

这有可能吗?或者我应该更改代码,如果它没有改变则放置0,如果它确实改变则放置1,考虑到我将使用它改变的值?

1 个答案:

答案 0 :(得分:1)

cellfun 方法 -

b1 = padarray(sign(dx0(:,1:end-1))~=sign(dx0(:,2:end)),[0 1],'pre')
out = cellfun(@find,mat2cell(b1,ones(1,size(b1,1)),size(b1,2)),'uni',0)

上面的代码假设你有padarray,这似乎是MATLAB的图像处理工具箱的最新成员。所以,如果你没有它,你可以像这样连接zeros(和false) -

b1 = sign(dx0(:,1:end-1))~=sign(dx0(:,2:end))
b1 = [false(size(b1,1),1) b1]
out = cellfun(@find,mat2cell(b1,ones(1,size(b1,1)),size(b1,2)),'uni',0)

使用cellfun with nonzeros function -

的替代解决方案
b1 = padarray(sign(dx0(:,1:end-1))~=sign(dx0(:,2:end)),[0 1],'pre')
out = cellfun(@nonzeros,mat2cell(bsxfun(@times,b1,1:size(b1,2)),ones(1,size(b1,1)),size(b1,2)),'uni',0)

out包含行sign更改的位置,可以使用celldisp(out)显示。

可以使用 -

计算counts更改的sign
counts = cellfun(@numel,out)