【问题标题】:How to make elements of multiple vectors repeated by MATLAB? [duplicate]MATLAB如何使多个向量的元素重复? [复制]
【发布时间】:2015-01-18 20:25:16
【问题描述】:

我有 2 个数据向量 d1 = [1 2 1 3 4]d2 = [3 1 2 1],以及 2 个引用 howMany1= [3 2 2 1 2]howMany2 = [2 1 2 2]。 d1 和 d2 的元素要根据 howMany1 和 howMany2 的元素重复:所以 d1(1) 即 d1 的第一个元素应该重复 3 次,d1(2) 应该重复 2 次,依此类推。最终结果应该是d1_repeated = [1 1 1 2 2 1 1 3 4 4]d2_repeated = [3 3 1 2 2 1 1]

我怎么能在 MATLAB 中做到这一点?我查看了一篇类似的帖子,其中重复了一个向量,所以我尝试做同样的事情并制作了一个 for 循环。这是我的代码:

clear all
close all
clc
% data

d1 = [1 2 1 3 4];
d2 = [3 1 2 1];
howMany1 = [3 2 2 1 2]; % Determines how many times each index in IDX1 should be repeated.
howMany2 = [2 1 2 2];
d = {d1 d2}
howMany = {howMany1 howMany2}
Anew = cell(1,2)
for k = 1:2 % 2 data vectors     
Anew{1,k} = arrayfun(@(x) repmat(d{k}(x), howMany{k}(x), 1), 1:numel(d{k}), 'uni', 0);
Anew = vertcat(Anew{:});

end

但我收到以下错误:

Error using vertcat

Dimensions of matrices being concatenated are not consistent.

然后我尝试将 vert cat 更改为 horzcat,但我收到了作为双打组的重复:

Anew = 

  Columns 1 through 7

    [3x1 double]    [2x1 double]    [1]    [2x1 double]    [2x1 double]    [2x1 double]    [3]

  Column 8

    [2x1 double]

我想知道这里有什么问题?感谢您抽出宝贵时间。

【问题讨论】:

标签: matlab for-loop


【解决方案1】:

这可以通过结合 ismember 和 cumsum 来完成:

d1(cumsum(ismember(1:sum(howMany1),cumsum([1 howMany1]))))

细分

1:sum(howMany1)howMany1 的累积总和进行比较。这是一个带有 1 和 0 的向量,它显示了 d1 中下一个值应该开始的位置。

ismember(1:sum(howMany1),cumsum([1 howMany1]))
ans =
     1     0     0     1     0     1     0     1     1     0

这个的累积和给出了一个看起来像这样的向量:

cumsum(ismember(1:sum(howMany1),cumsum([1 howMany1])))
ans =
     1     1     1     2     2     3     3     4     5     5

现在,在创建 d1_repeated 时,它可以用作d1 的索引。

d1(cumsum(ismember(1:sum(howMany1),cumsum([1 howMany1]))))
ans =
     1     1     1     2     2     1     1     3     4     4

【讨论】:

  • 尽管是一个重复的问题,但这是一个新颖的答案。巧妙利用ismember! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多