【问题标题】:Create a matrix with a changing number of columns创建一个列数不断变化的矩阵
【发布时间】:2014-05-20 14:40:07
【问题描述】:

我正在尝试制作一个自制版本的 peakfinder.m,使其与多个阵列一起工作,而不是一次只使用一个,以提高时间效率。 (http://www.mathworks.com/matlabcentral/fileexchange/25500-peakfinder)

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

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 3。你怎么能有1,因为1 的左边没有任何东西,因此那里不可能改变符号,或者那里?希望我没有做出任何荒谬的假设。或者1 是否意味着一行的第二列与该行的第一列有符号变化?
  • Arrr,我写错了乱码:P 你确实是对的,1 不可能发生!
  • 编辑后才有意义! :)
  • 完成后请务必运行基准测试。仅仅对矩阵而不是单独的向量进行操作可能不足以获得任何性能。
  • 考虑到我的矩阵的实际大小是 264244x1000,我认为这种方式会比使用“for”循环更快。但我会记住这一点,谢谢!

标签: arrays matlab matrix indexing


【解决方案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) 显示。

sign 变化中的counts 可以使用 -

来计算
counts = cellfun(@numel,out)

【讨论】:

  • 这是解决问题的真正机智的方法。谢谢!有一些事情现在不起作用,但我会让它起作用!
  • 也许你会知道为什么它会给我这个错误。我准确地输入了您写下的内容,但它给了我一个错误提示:“未定义函数 'padarray' 用于类型为 'double' 的输入参数。”我对这个错误感到很困惑!
  • 天才。这让我很困惑,因为我有 Matlab 2014a,所以我以为我会有 padarray,但似乎我没有。再次感谢您!
  • @Vissenbot 认为您没有包含此padarray 功能的图像处理工具箱。抱歉,我必须提到这一点,或者让我添加该信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多