小编mer*_*erv的帖子

按顺序查找零个岛屿

想象一下,你有一个很长的序列.查找序列全为零的间隔的最有效方法是什么(或者更确切地说,序列降至接近零的值abs(X)<eps):

为简单起见,我们假设以下顺序:

sig = [1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0];
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取以下信息:

startIndex   EndIndex    Duration
3            6           4
12           12          1
14           16          3
25           26          2
30           30          1
Run Code Online (Sandbox Code Playgroud)

然后使用这些信息,我们找到持续时间> =到某个指定值(例如3)的间隔,并返回所有这些间隔中的值的索引组合:

indices = [3 4 5 6 14 15 16];
Run Code Online (Sandbox Code Playgroud)

最后一部分与前一个问题有关:

MATLAB:从开始/结束索引列表创建矢量化数组

这是我到目前为止:

sig = [1 1 0 0 0 0 1 …
Run Code Online (Sandbox Code Playgroud)

matlab vectorization

34
推荐指数
2
解决办法
1万
查看次数

如何将矢量转换为单元格数组?

我有一个列矢量我想转换为单元格数组,如:

A = rand(10,1);

B = cell(10,1);
for i=1:10
    B{i} = A(i);
end

B = 
    [0.6221]
    [0.3510]
    [0.5132]
    [0.4018]
    [0.0760]
    [0.2399]
    [0.1233]
    [0.1839]
    [0.2400]
    [0.4173]
Run Code Online (Sandbox Code Playgroud)

如果没有明确的for循环,我怎么能这样做呢?我试过了:

B{:} = A(:)
Run Code Online (Sandbox Code Playgroud)

[B{:}] = deal(A)
Run Code Online (Sandbox Code Playgroud)

没有运气......

如果可能的话,我怎么能对矩阵做同样的事情,即单元格中的每个元素本身?

matlab vectorization

15
推荐指数
1
解决办法
2万
查看次数

从开始/结束索引列表创建矢量化数组

我有一个双列矩阵M,包含一堆间隔的开始/结束索引:

startInd   EndInd
1          3
6          10
12         12
15         16
Run Code Online (Sandbox Code Playgroud)

如何生成所有区间索引的向量:

v = [1 2 3 6 7 8 9 10 12 15 16];
Run Code Online (Sandbox Code Playgroud)

我正在使用循环进行上述操作,但我想知道是否有更优雅的矢量化解决方案?

v = [];
for i=1:size(M,1)
    v = [v M(i,1):M(i,2)];
end
Run Code Online (Sandbox Code Playgroud)

matlab vectorization

11
推荐指数
2
解决办法
2359
查看次数

MATLAB:计算时间序列的每1分钟间隔的平均值

我有一堆时间序列,每个时间序列由两个组件描述,一个时间戳向量(以秒为单位),以及一个测量值向量.时间向量是不均匀的(即以非常规间隔采样)

我试图计算每个1分钟间隔值的平均值/ SD(采用X分钟间隔,计算其平均值,采用下一个间隔,......).

我当前的实现使用循环.这是我到目前为止的样本:

t = (100:999)' + rand(900,1);       %' non-uniform time
x = 5*rand(900,1) + 10;             % x(i) is the value at time t(i)

interval = 1;         % 1-min interval
tt = ( floor(t(1)):interval*60:ceil(t(end)) )';  %' stopping points of each interval
N = length(tt)-1;

mu = zeros(N,1);
sd = zeros(N,1);

for i=1:N
    indices = ( tt(i) <= t & t < tt(i+1) ); % find t between tt(i) and tt(i+1)
    mu(i) = mean( x(indices) );
    sd(i) = std( x(indices) …
Run Code Online (Sandbox Code Playgroud)

matlab time-series vectorization

10
推荐指数
1
解决办法
1万
查看次数

根据计数的元素数组复制

我的问题是与此类似一个,但我想根据在相同尺寸的第二阵列指定的计数复制每个元素.

这方面的一个例子,比如我有一个数组v = [3 1 9 4],我想用它rep = [2 3 1 5]来复制第一个元素2次,第二次复制,依此类推[3 3 1 1 1 9 4 4 4 4 4].

到目前为止,我正在使用一个简单的循环来完成工作.这就是我的开始:

vv = [];
for i=1:numel(v)
    vv = [vv repmat(v(i),1,rep(i))];
end
Run Code Online (Sandbox Code Playgroud)

我设法通过预先分配空间来改进:

vv = zeros(1,sum(rep));
c = cumsum([1 rep]);
for i=1:numel(v)
    vv(c(i):c(i)+rep(i)-1) = repmat(v(i),1,rep(i));
end
Run Code Online (Sandbox Code Playgroud)

但是我仍然觉得必须有一个更聪明的方法来做到这一点......谢谢

arrays matlab repeat run-length-encoding elementwise-operations

8
推荐指数
1
解决办法
2926
查看次数