【问题标题】:Interleave and Deinterleave a vector into two new vectors将一个向量交错和去交错成两个新向量
【发布时间】:2020-10-23 23:46:36
【问题描述】:

Interleaver:假设我们有向量X= randi(1,N) 我想将X 的内容拆分成两个新向量X1X2,这样X 的第一个元素是X1的第一个元素,X2的第一个元素是X的第二个元素,X的第三个元素是X1的第二个元素,X的第四个元素是X2... 的第二个元素等直到向量 `X 的最后一个元素。

我有以下想法

X1(1)=X(1);
X2(1)=X(2);


for i=1:length(X)
X1(i)= X(i+2);
end
for j=2:length (X)
X2(i)= X(i+2)
end

我的问题是:我的方法正确吗?有更好的方法吗?

去交织器 我也有相反的问题所以基本上在这种情况下我有X1X2并想恢复X,我将如何有效地恢复X

【问题讨论】:

  • X1=X(1:2:end) X2=X(2:2:end) 你的方法不起作用,因为在最后一次迭代中你要求X(length(X)+2),它不存在。
  • 谢谢。所以基本上没有别的办法了吗?
  • 有很多方法,如果解决了你的方法。
  • 我认为你的方法会很好用......

标签: arrays matlab vector


【解决方案1】:

我认为很难找到比这更清洁的解决方案:

x  = 1:20
x1 = x(1:2:end)
x2 = x(2:2:end)

【讨论】:

  • 这是deinterlieve案例,interlieve呢?
【解决方案2】:

我也希望有一些很酷的新衬线,但无论如何,按照上一个答案,您可以对分配使用相同的索引表达式。

x  = 1:20
x1 = x(1:2:end)
x2 = x(2:2:end)
y = zeros(20,1)
y(1:2:end) = x1
y(2:2:end) = x2

【讨论】:

  • 我觉得我应该得到一些部分功劳,因为至少能引起更好的答案。 :-) 但是是的,重塑绝对是更真实的道路。
  • 确实,您的编辑将此问题带到了活动问题的首页。
  • ...我猜由于投票的支持,我确实获得了部分荣誉!
【解决方案3】:

我认为这个问题中的术语是颠倒的。交错是合并两个交替值的向量:

x1 = 10:10:100;
x2 = 1:1:10;
x = [x1;x2];
x = x(:).';

这个和单线一样:

x = reshape([x1;x2],[],1).';

解交织将分离交织的数据,正如David in a commentTom in an answer 已经建议的那样:

y1 = x(1:2:end);
y2 = x(2:2:end);

但也可以通过许多其他方式完成,例如颠倒我们上面遵循的过程:

y = reshape(x,2,[]);
y1 = y(1,:);
y2 = y(2,:);

验证:

isequal(x1,y1)
isequal(x2,y2)

【讨论】:

    【解决方案4】:

    只是添加另一个选项,您可以使用deal 函数和一些预先计算的索引。这与the answer from Peter M 基本相同,但将分配集中到单行中:

    X = randi(10, [1 20]);  % Sample data
    ind1 = 1:2:numel(X);    % Indices for x1
    ind2 = 2:2:numel(X);    % Indices for x2
    
    [x1, x2] = deal(X(ind1), X(ind2));  % Unweave (i.e. deinterleave)
    
    [X(ind1), X(ind2)] = deal(x1, x2);  % Interleave
    

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多