将数组中的元素复制到Matlab中的其他数组中

时间:2018-06-24 11:03:13

标签: arrays matlab for-loop cell bsxfun

在Matlab中,我有一个数组"latencies"(大小1x11)和一个单元格数组"Latencies_ms"(大小1x298)。 latenciesLatencies_ms的较小部分,即latencies中的值存在于Latencies_ms中。我希望能够在latencies内的Latencies_ms中找到每个值,然后将1000添加到该值并在Latencies_ms内重复8次。

例如,

latencies = [62626  176578  284690  397708  503278  614724  722466] 

和(一小部分Latencies_ms)

Latencies_ms = {3458, 62626, 123456, 7891011, 121341, 222112, 176578}

我希望输出为

out = {3458, 62626, 63626,  64626,  65626,  66626,  67626,  68626,  69626,  70626, 123456, 7891011, 121341, 222112, 176578, 177578, 178578, 179578, 180578, 181578, 182578, 183578, 184578,}

作为起点,我决定看看是否可以仅复制每个元素而无需添加1000,并且我在repmat中使用了以下代码:

out = arrayfun( @(x,b)[x; repmat({latencies},8,1)],... 
Latencies_ms, ismember(cell2mat(Latencies_ms),latencies), 'uni', 0 );
out = vertcat(out4{:});

我将延迟元素与Latencies_ms匹配,然后使用repmat,但是像这样使用它会在正确的位置插入整个latencies数组,而不是重复元素。

然后,如果我尝试使用这样的for循环:

for i=1:length(latencies)
   out = arrayfun( @(x,b)[x; repmat({latencies(i)},8,1)],... 
   Latencies_ms, ismember(cell2mat(Latencies_ms),latencies), 'uni', 0 );
   out = vertcat(out4{:});
end

它仅重复延迟的最后一个元素,因此它可以正确执行复制操作,但不能正确复制元素。

我对arrayfun不太熟练,我的主要目的是避免使用for循环,因此我敢肯定这不是正确的方法,但我觉得我快到了...有人知道我在想什么吗???

我不必使用arrayfun,我尝试使用for循环来做到这一点,但是它有点混乱,但是仅使用arrayfun并没有限制,我只想获得正确的输出!

1 个答案:

答案 0 :(得分:1)

这是一种无循环方式:

ind = ismember([Latencies_ms{:}] , latencies);      %Indices of the values to be repeated
repvals = bsxfun(@plus, repmat([Latencies_ms{ind}], 9, 1).', 0:1000:8000); %Rep+increment
out = Latencies_ms;
out(ind) = mat2cell(repvals, ones(1, sum(ind)), 9); %Replacing with repeated+inc elements
out = [out{:}]; %Converting to comma-separated list and then concatenating horizontally

第二行和第四行的因数9在那里,因为匹配的元素将被保留一次并重复8次(增量= 9次)。第二行可以用≥R2016b的隐式扩展编写为:

repvals  = repmat([Latencies_ms{ind}], 9, 1).' + (0:1000:8000);

arrayfun是循环的单行包装器。这仍然是一个循环。但是循环(从R2015b开始)在较新版本中已得到显着改善,有时它们的性能甚至超过了矢量化代码。因此,除非遇到瓶颈,否则就不必避免复杂的向量化可以理解的简单循环。