将数组中的元素复制到Matlab中的不同数组中
Replicate elements from an array into a different array in Matlab
在 Matlab 中,我有一个数组 "latencies"
(大小 1x11)和一个元胞数组 "Latencies_ms"
(大小 1x298)。 latencies
是 Latencies_ms
的一小部分,即 latencies
中的值存在于 Latencies_ms
中。我希望能够在 Latencies_ms
内的 latencies
中找到每个值,然后将 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 没有限制我只是想获得正确的输出!
这是一个无环的方式:
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
第 2 行和第 4 行的因子 9
在那里,因为匹配的元素将保留一次并以增量重复 8 次(总计 = 9 次)。第二行在≥R2016b中隐式展开可以写成:
repvals = repmat([Latencies_ms{ind}], 9, 1).' + (0:1000:8000);
arrayfun
是一个循环的单行包装器。 还是一个循环。但是循环在较新版本(从 R2015b 开始)中得到了显着改进,有时它们的性能甚至超过了矢量化代码。因此,除非是瓶颈,否则无需避免您可以理解复杂矢量化的简单循环。
在 Matlab 中,我有一个数组 "latencies"
(大小 1x11)和一个元胞数组 "Latencies_ms"
(大小 1x298)。 latencies
是 Latencies_ms
的一小部分,即 latencies
中的值存在于 Latencies_ms
中。我希望能够在 Latencies_ms
内的 latencies
中找到每个值,然后将 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 没有限制我只是想获得正确的输出!
这是一个无环的方式:
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
第 2 行和第 4 行的因子 9
在那里,因为匹配的元素将保留一次并以增量重复 8 次(总计 = 9 次)。第二行在≥R2016b中隐式展开可以写成:
repvals = repmat([Latencies_ms{ind}], 9, 1).' + (0:1000:8000);
arrayfun
是一个循环的单行包装器。 还是一个循环。但是循环在较新版本(从 R2015b 开始)中得到了显着改进,有时它们的性能甚至超过了矢量化代码。因此,除非是瓶颈,否则无需避免您可以理解复杂矢量化的简单循环。