我的 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/