2017-10-25 12 views
-1

Matlabにサイズnの2ストライド置換行列を作成する痛みのない方法はありますか? nの2ストライド置換とその逆行列Matlab

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 

例えば= 4:

は、これは、私はそれが次のように

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

に作用Lような線形演算子の行列形式を検索すること マトリックスは

[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] 

余分な質問:上のLの逆数を演算子形式(答えの1行の構文)にします。 行列形式では、逆行列の転置はLです。また、ceil(n/2)ストライド順列でもあります。

TL; DR ceil(n/2)ストライド順列に出力を生成する最も簡単な方法は何ですか?

+0

私はdownvotedていないが、それは部分的に、それは今、元から外れるように、あなたの質問を編集する可能性があります!あなたの "余分な質問"は少し曖昧で混乱しているだけでなく、(もちろん)元のものに "余分に"なっている - あなたが受け入れていない良い回答を不完全にしている。別の、明確で十分に記述された質問をするだけでよいでしょう – Wolfie

答えて

2

ソリューション

最も簡単な解決策は、以下の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と

ソリューション

この問題は、以下の例に見られるように、n×nの行列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 
関連する問題