次のような3x3行列があると仮定します
b = 2 * eye(3);
ans =
2 0 0
0 2 0
0 0 2
そして、私は次のような3x4の行列にしたい
1 2 0 0
1 0 2 0
1 0 0 2
それを得る最良の方法は何ですか?
これを行う簡単なインライン方法は次のとおりです。
b = [ones(size(b, 1), 1) b];
In GNU Octave:
2つのマトリックスを水平方向に連結します:スペースでマトリックスを分離し、
そして結果を角括弧で囲みます:
X = [ones(rows(X), 1) X];
より簡単な例:
1つの番号に接着(水平の「列」要素にカンマを追加):
octave:1> [[3,4,5],8]
ans =
3 4 5 8
コンマを使用して、別のマトリックスに水平に(追加の列として)接着します。
octave:2> [[3,4,5],[7,8,9]]
ans =
3 4 5 7 8 9
セミコロンを使用して別のマトリックスに垂直に(追加の行として)接着します。
octave:3> [[3,4,5];[7,8,9]]
ans =
3 4 5
7 8 9
1つの方法は次のとおりです。
function [result] = prependOnes(matrix)
result = [ones(rows(matrix),1) matrix];
end
prependOnes(b)
[A B]
は、実際には挿入とは反対に新しいマトリックスを作成します。これは、その構文構造から明らかです。しかし、Wordappendまたはinsertオクターブが背後で何か巧妙なことをしているのではないかと思うので、テストを実行します
function testAppend(repeat)
profile off;
profile on;
testAdd(repeat);
testAssign(repeat);
profile off;
data = profile('info');
profshow(data, 5);
end
function testAdd(repeat)
for i = 1:repeat
A = ones(100, 1);
B = ones(100, 1);
for j = 1:10000
A = [A B];
end
end
end
function testAssign(repeat)
for i = 1:repeat
B = ones(100, 1);
A = zeros(100, 10000);
for j = 2:10001
A(:, j) = B;
end
end
end
そして、ここに結果があります
octave:1> testAppend(1)
# Function Attr Time (s) Calls
---------------------------------------------------------
1 testAppend>testAdd 9.454 1
3 testAppend>testAssign 0.023 1
4 zeros 0.001 1
5 profile 0.000 1
2 ones 0.000 3
そのため、マトリックスを継続的に成長させる必要がある場合は、最初にターゲットマトリックスを作成してから、値を割り当てます。または、最終的な次元が事前にわからない場合は、サイズ変更マトリックスのようなものを実装します。
関数 padarray (from image package )は、まさにそれを行うために設計されました。
octave> b = 2 * eye (3)
b =
Diagonal Matrix
2 0 0
0 2 0
0 0 2
octave> padarray (b, [0 1], 1, "pre")
ans =
1 2 0 0
1 0 2 0
1 0 0 2
この関数は、変数b
に0行と1列を事前に埋め込みます。この関数は、行列をパディングする際に大きな柔軟性を可能にしますが、本当に単純なものではやり過ぎかもしれません。
B行列は以下のように定義されます
>> b = [1 2 3;4 5 6;7 8 9]
b =
1 2 3
4 5 6
7 8 9
以下のように1の新しい列を追加して新しいマトリックスを作成します
>> [ones(size(b), 1) b]
ans =
1 1 2 3
1 4 5 6
1 7 8 9
以下のように1の新しい行を追加して新しいマトリックスを作成します
>> [ones(size(b)(2), 1)';b]
ans =
1 1 1
1 2 3
4 5 6
7 8 9