我尝试使用自制版本的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,考虑到我将使用它改变的值?
答案 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)