【问题标题】:2-stride permutation and its inverse in MatlabMatlab中的2步置换及其逆
【发布时间】:2017-10-25 08:22:12
【问题描述】:

在 Matlab 中创建大小为 n 的 2 步置换矩阵是否有一种轻松的方法?

这意味着我想找到线性运算符L 的矩阵形式,使其作用于

x = [x(1), x(2), ..., x(n)] 

通过以下方式:

L*x = [x(1), x(3), ..., x(n-1), x(2),x(4), ..., x(n)]  % when n is even

L*x = [x(1), x(3), ..., x(n), x(2), x(4), ..., x(n-1)] % when n is odd

例如对于 n = 4: 矩阵是

 [1 0 0 0;
  0 0 1 0;
  0 1 0 0;
  0 0 0 1]

或 n = 5:

[1 0 0 0 0;
 0 0 1 0 0;
 0 0 0 0 1;
 0 1 0 0 0;
 0 0 0 1 0]

额外的问题:现在我想要 Labove 的逆运算符形式(答案中的单行语法)。 在矩阵形式中,逆矩阵是L 的矩阵的转置。也是ceil(n/2)步幅排列。

TL;DR 产生输出到ceil(n/2) 步幅排列的最简单方法是什么?

【问题讨论】:

  • 我没有投反对票,但这可能部分是由于您编辑了您的问题,因此它现在偏离了原始问题!您的“额外问题”有点模糊和令人困惑,并且(当然)是原始问题的“额外” - 使好的答案(您没有接受)不完整。最好简单地问另一个清晰且描述清楚的问题

标签: matlab matrix permutation matrix-multiplication


【解决方案1】:

解决方案

最简单的解决方案是使用以下单行语法:

result = x([1:2:n,2:2:n]);

在 n=9 和 x=1:9 的情况下,我们得到以下结果:

result =

 1
 3
 5
 7
 9
 2
 4
 6
 8

也可以用线性函数求解,如下所述。

线性算子 L 的解

这个问题也可以通过生成nxn矩阵L来解决,如下例所示,n=9:

L = zeros(n,n);
L(sub2ind(size(L),1:n,[1:2:n,2:2:n])) = 1;

L =

 1     0     0     0     0     0     0     0     0
 0     0     1     0     0     0     0     0     0
 0     0     0     0     1     0     0     0     0
 0     0     0     0     0     0     1     0     0
 0     0     0     0     0     0     0     0     1
 0     1     0     0     0     0     0     0     0
 0     0     0     1     0     0     0     0     0
 0     0     0     0     0     1     0     0     0
 0     0     0     0     0     0     0     1     0

完整代码示例

%input example    
n = 9; x = [1:n]'; 

%generates a matrix L
L = zeros(n,n);
L(sub2ind(size(L),1:n,[1:2:n,2:2:n])) = 1;

%calculates result
result = L*x;

结果

输入

x =
 1
 2
 3
 4
 5
 6
 7
 8
 9

输出

result =
 1
 3
 5
 7
 9
 2
 4
 6
 8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多