arrays - 在 matlab 中仅打印数组中的连续数字

标签 arrays matlab

我的 matlab 代码中有一个数组,我想做的是, 假设数组是:

wf_array = [1 2 3 4 5 6 7 8 9 10 11  25 26 28 29 45 46 47 48 49 50 51 52 53 54 55 56 57]

预期输出为:1 2 3 4 5 6 7 8 9 10 11 和 45 46 47 48 49 50 51 52 53 54 55 56 57

因此,如果该系列至少有 10 个数字是连续的,则 o/p 应包含该数组中的连续数字。

我尝试过以下方法

v = wf_array;
x = [0 cumsum(diff(v)~=1)];
final = v(x==mode(x));

但它只打印该数组中最长的连续流,因为它应该打印至少有 10 个数字的所有连续流。请帮忙...

提前致谢

最佳答案

好吧,当至少有一个不连续的值时,您的 cumsum 就会累加。这意味着,您的每个流在 x 中都会有不同的编号。另一方面,mode 只查找最频繁的数字和其中最小的一个(因此,如果有多个长度相同的流,则将采用第一个)。根据 mode 的文档,“mode 函数不适合在具有多种模式的分布中查找峰值。”

因此有 3 种方法可以解决这个问题。第一个是改变 x 以使所有流具有相同的数字。第二种是将 mode 替换为可以找到多种模式的东西。第三种是采取完全不同的做法,将数组进行拆分。

我会选择第三个,因为我认为这是“最简单的”。

w = find( diff(v)~=1 ); %// this contains all indices where the data jumps
x = diff([0 w length(v)]); %// this contains the lengths of the streams
y = mat2cell(v,1,x); %// creates a cell array with each consecutive stream
z = y( cellfun('size',y,2)>=10 ) %// picks those cells with length of at least 10
final = cell2mat(z); %// revert it back to an array

请注意,此尝试并不可靠,并且仅适用于大小为 1xN 的数组。如果您的原始输入数组的形状不同,您应该首先重新调整它的形状:

v = input_array_of_arbitrary_size(:)'; %'// reshapes into row vector columnwise

例如,如果您输入的是

in = [1 4 7
      2 5 8
      3 6 9];

结果将是:

v = in(:)' %'//random comment to fix SO's syntax highlighting
v =

     1     2     3     4     5     6     7     8     9

这适用于任何维度的数组,并将在末尾附加每个维度。有关详细信息,请查看线性索引。

关于arrays - 在 matlab 中仅打印数组中的连续数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21547239/

相关文章:

java - 如何根据值按升序排列数组列表

arrays - bash 中的数组运算符

matlab - 如何设置 'renderer' ?

matlab - 删除死区或增加子图中图形的大小

matlab - MATLAB 是行特定的还是列主要的?

javascript - 为什么在 javascript 中向数组原型(prototype)添加方法会中断 for 循环的迭代?

java - 如何确定并返回数组中字母表中第一个字母

将非 null 终止的 char 数组的内容复制到另一个 char 数组中

Matlab 进程内存泄漏超过 16 天

r - 将 MATLAB 'imagesc' 函数转换为使用 R 的 'imagesc' 库中的 R 的 'matlab'