想象一下,你有一个很长的序列.查找序列全为零的间隔的最有效方法是什么(或者更确切地说,序列降至接近零的值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)
最后一部分与前一个问题有关:
这是我到目前为止:
sig = [1 1 0 0 0 0 1 …Run Code Online (Sandbox Code Playgroud) 我有一个列矢量我想转换为单元格数组,如:
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)
没有运气......
如果可能的话,我怎么能对矩阵做同样的事情,即单元格中的每个元素本身?
我有一个双列矩阵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) 我有一堆时间序列,每个时间序列由两个组件描述,一个时间戳向量(以秒为单位),以及一个测量值向量.时间向量是不均匀的(即以非常规间隔采样)
我试图计算每个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) 我的问题是与此类似一个,但我想根据在相同尺寸的第二阵列指定的计数复制每个元素.
这方面的一个例子,比如我有一个数组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